当前位置: 首页 > 编程语言 > C#

C#Collection-按元素排序(旋转)share

时间:2023-04-10 16:53:10 C#

C#Collection-按元素排序(旋转)我有一个IEnumerable集合。假设它包含5个点(实际上它更像是2000个)我想对集合进行排序,以便集合中的特定点成为第一个元素,因此它基本上在特定点处切割集合并将它们重新组合在一起。所以我的5点列表:{0,0}、{10,0}、{10,10}、{5,5}、{0,10}重新排序索引3处的元素将变为:{5,5},{0,10},{0,0},{10,0},{10,10}解决这个问题的计算效率最高的方法是什么,或者是否已经存在内置方法...如果是,我似乎找不到!varlist=new[]{1,2,3,4,5};varrotated=list.Skip(3).Concat(list.Take(3));//rotated现在是{4,5,1,2,3}在这种情况下,一个简单的数组副本是O(n),这应该足以满足几乎所有实际目的。但是,我承认在某些情况下——如果这是多级算法的深层问题——它可能是相关的。此外,您是否只需要迭代此集合或以有序的方式创建副本?链表很容易像这样重组,尽管访问随机元素会更昂贵。一般来说,计算效率还取决于您访问项目集合的精确程度(以及它们是什么类型的项目-值类型或引用类型?)。标准.NET链表似乎不支持这样的手动操作,但一般来说,如果您有一个链表,您可以轻松地按照您描述的方式移动部分列表,只需指定新的“next”和“previous""指向端点的指针。这里的集合库支持此功能:http://www.itu.dk/research/c5/。具体来说,您正在寻找LinkedList.Slide()方法,您可以在LinkedList上调用它。View()返回的对象使用此方法。该版本没有枚举列表两次,但由于T[],内存消耗较高:publicstaticIEnumerableRotate(IEnumerablesource,intcount){inti=0;T[]temp=newT[count];foreach(variteminsource){if(i注意:添加参数检查。ulrichb显示的Linq方法的另一种替代方法是使用队列类(fifo集合)出列到您的索引并将您已经拥有的索引排队dequeued...使用linq的简单实现是:IEnumerablex=new[]{1,2,3,4};vartail=x.TakeWhile(i=>i!=3);varhead=x.SkipWhile(i=>i!=3);varcombined=head.Concat(tail);//现在是3,4,1,2这里发生的事情是你执行了到达组合序列中第一个所需的两个比较elements.这个解决方案可读性强,紧凑,但是效率不是很高。其他贡献者描述的解决方案可能更高效,因为他们使用特殊的数据结构,如数组或列表。以上是C#学习教程:C#Collection-byelementAll整理(轮换)分享的内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注,本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: