簡體   English   中英

如何使用.NET排序大量列表的一部分?

[英]How can I sort just part of a huge list using .NET?

在.NET中,泛型列表具有接受IComparerComparison的排序功能。 我想只列出一份清單的一部分。 希望我可以指定起始索引,要排序的元素數和lambda函數。 看起來如果要對整個列表進行排序,只能使用lambda函數來執行此操作。 這是對的還是我錯過了什么?

其他要求:

  • 按位排序(以節省內存/時間)
  • 最終列表與原始列表的長度相同
List<int> mylist = new List<int>() {8,4,6,2,1,5,3,1,7};
List<int> myRange = mylist.GetRange(2,4);

mylist.RemoveRange(2, 4);
mylist.InsertRange(2,  myRange.OrderBy(i => i));

mylist.Dump();

編輯:將Dump視為在列表中運行foreach並將其打印到控制台。
這正在改變原始列表的內容。

EDIT2:看看這段代碼是否有用

    List<int> mylist = new List<int>() ;
    for(int i=9999999; i > 0; i--)
    {
        mylist.Add(i);
    }

    Console.WriteLine("start " + DateTime.Now.Ticks);
    var extract = mylist.Skip(10).Take(1000000).OrderBy(i => i);

    int k = 10; // start from (because we skipped from 10 onwards above)
    foreach(int item in extract)
    {
        mylist[k++] = item;
    }


    Console.WriteLine("done" + DateTime.Now.Ticks);
    foreach(int item in mylist)
        Console.WriteLine(item);

您可以提取子列表,然后將其復制回而不是RemoveRangeInsertRange 是的,我知道,這也不是原地,但缺少重寫Sort你不會找到這樣的解決方案。

Dim myList As New List<int>() { 8, 4, 6, 2, 1, 5, 3, 1, 7 }
Dim myRange = myList.GetRange(2,4)

myRange.Sort(yourComparer)
Dim i = 2;
For Each item in myRange
    mylist(i) = item
    i += 1
Next

如果你能找到一種方法來使用一些過濾工具,你可以使用list或linq方法。 以下是使用FindAll的示例。

genericList = genericList.FindAll(x => x.Field).OrderBy(y => y.Field).ToList();

您是否要求列表在此之后仍需要所有項目,或者您是否只處理訂購的子集? 如果是后者那么你可以使用常規的Linq來做到這一點 - 這樣的事情可能適合你。

IEnumerable<T> enumerable = GetTheListToWorkWith();
IEnumerable<T> sortedStuff = enumerable.Skip(startIndex).Take(endIndex).OrderBy(t => t.ValueToCompare);

但是,此方法不會更改原始列表 - 它只返回一個只有List的已排序部分的新IEnumerable。

作為備用(如果所有數據都需要保留在列表中,您可以刪除需要排序的子集,對其進行排序,然后將其重新附加到原始列表中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM