C#学习教程:将两个列表合并为一个并对项目进行排序此外,我正在寻找一种不使用API方法(例如联合、排序等)的解决方案。示例代码。privatestaticvoidMergeAndOrder(){varlistOne=newList{3,4,1,2,7,6,9,11};varlistTwo=新列表{1,7,8,3,5,10,15,12};//不使用C#辅助方法...//ToDo................................//使用C#API.varexpectedResult=listOne.Union(listTwo).ToList();expectedResult.Sort();//Output:1,2,3,4,5,6,7,8,9,10,11,12,15//我需要相同的结果而不使用API??方法,那也是通过仅迭代项目一次。PS:我在面试中被问到这个问题,但还没有找到答案。如果没有在合并+排序操作之前对两个列表进行排序的前提条件,则无法在O(n)时间(或“使用循环”)中执行此操作。加上那个先决条件,问题就很简单了。保留两个迭代器,每个列表一个。在每个循环中,比较每个列表中的元素并选择较小的一个。递增列表的迭代器。如果要插入到最终列表中的元素已经是该列表中的最后一个元素,则跳过插入。在伪代码中:Lista={1,3,5,7,9}Listb={2,4,6,8,10}Listresult={}inti=0,j=0,lastIndex=0while(i=a.length)if(result[lastIndex]!=b[j])result[++lastIndex]=b[j]j++continue//如果我们用完b,就吞掉a(但不要t添加重复项)if(j>=b.length)if(result[lastIndex]!=a[i])result[++lastIndex]=a[i]i++continueintsmallestVal//选择a或b中较小的一个if(a[i]为什么你不能使用api方法?重新发明轮子是愚蠢的。另外,这是一个.ToList()调用,它会杀死你。永远不要调用.ToList()或.ToArray()直到你必须这样做,因为它们会破坏你的懒惰评估。这样做,你列出了所需的最小数量:varexpectedResult=listOne.Union(listTwo).OrderBy(i=>i);这将使用哈希集联合执行循环,延迟执行意味着排序的基础传递将取决于联合。但我认为不可能在一次迭代中进行排序,因为排序不是O(n)操作。privatestaticvoidMergeTwoSortedArray(int[]first,int[]second){//抛出新的NotImplementedException();int[]result=newint[first.Length+second.Length];inti=0,j=0,k=0;while(i使用迭代器和流接口,任务并不复杂:classMergeTwoSortedLists{staticvoidMain(string[]args){varlist1=newList(){1,3,5,9,11};varlist2=newList(){2,5,6,11,15,17,19,29};foreach(varcinSortedAndMerged(list1.GetEnumerator(),list2.GetEnumerator())){Console.Write(c+"");}Console.ReadKey();}privatestaticIEnumerableSortedAndMerged(IEnumeratore1,IEnumeratore2){e2.MoveNext();e1.MoveNext();do{while(e1.Current你可以写一个合并和循环重复删除列表,使用二分查找的方式,将新值插入到目标列表中varlistOne=newList{3,4,1,2,7,6,9,11};varlistTwo=newList{1,7,8,3,5,10,15,12};varresult=listOne.ToList();foreach(varninlistTwo){if(result.IndexOf(n)==-1)result.Add(n);}我见过的最接近的解决方案是分配一个数组,知道整数是有界的。int[]values=newint[Integer.MAX];//用0初始化intsize1=list1.size();intsize2=list2.size();for(intpos=0;possize1?list2[pos-size1]:list1[pos];values[val]++;}然后你可以争辩说你有一个“特殊”形式的排序数组:-)得到一个干净的排序数组你需要遍历值数组,跳过0计算所有位置并构建最终列表。这仅适用于整数列表,但很高兴这就是您所拥有的!列表sortedList=newList();foreach(intxinlistOne){sortedList=x;}foreach(intxinlistTwo){sortedList=x;这是使用每个列表中的值作为索引位置来存储值。任何重复值都会覆盖该索引位置的先前条目。它满足了只迭代一次值的要求。这当然意味着列表中会有“空”位置。我怀疑这个职位现在已经满了……?以上就是C#学习教程:MergeTwoListsintoOneandSortItems希望大家多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
