簡體   English   中英

排序清單 <List<MyType> &gt;

[英]Sorting List<List<MyType>>

到目前為止,我一直在嘗試2D列表“ NameValuePair”,但沒有運氣。

NameValuePair定義為:

public class NameValuePair
    {
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string Value { get; set; }
    }

該列表定義為:

List<List<NameValuePair>> outerList = new List<List<NameValuePair>>();

外部列表中的每個列表在不同的索引處可能具有不同數量的項目,但是每個列表肯定都有一個“日期”項目。

例如

List<List<NameValuePair>> outerList = new List<List<NameValuePair>>();
List<NameValuePair> innerList = new List<NameValuePair>();
List<NameValuePair> innerList2 = new List<NameValuePair>();


innerList.Add(new NameValuePair { Name = "List1Item1", Value = "someValue" });
innerList.Add(new NameValuePair { Name = "List1Item2", Value = "otherValue" });
innerList.Add(new NameValuePair { Name = "List1ItemN", Value = "anotherValue" });
innerList.Add(new NameValuePair { Name = "Date", Value = "aDateInStringFormat" });
innerList2.Add(new NameValuePair { Name = "List2Item1", Value = "myValue" });
innerList2.Add(new NameValuePair { Name = "Date", Value = "anotherDateInStringFormat" });
innerList2.Add(new NameValuePair { Name = "List2ItemM", Value = "bestValue" });

outerList.Add(innerList);
outerList.Add(innerList2);

我嘗試過用outerList.Sort();排序outerList.Sort(); outerList.OrderByDescending(x => x.Where(y => y.Name == "Date")).ToList(); 到目前為止沒有運氣。

我也嘗試通過重載CompareTo()IComparable實現為NameValuePair類型,但也無法使其正常工作。

任何建議都值得歡迎。

假設每個內部列表都只有一個名稱為Date且格式正確的date Value

var sorted = outerList.OrderBy(x => DateTime.Parse(x.Single(y => y.Name == "Date").Value))
                      .ToList();

Linq查詢采用Name “ Date”的NameValuePair ,將Value轉換為DateTime對象,並按此值對外部列表進行排序。

無論如何,您應該考慮使用DateTime屬性創建一個類。

我知道這已經得到了答案,但這是一個略有不同的方法,可能會更有效。

首先,對所有列表進行一次傳遞,以將日期時間提取到一個單獨的序列中:

var keys = outerList.Select(x => DateTime.Parse(x.Single(y => y.Name == "Date").Value));

然后使用Zip和該DateTime序列按該序列對外部列表進行排序:

outerList = outerList.Zip(keys, (pairs, date) => new {Pairs = pairs, Date = date})
    .OrderByDescending(item => item.Date)
    .Select(item => item.Pairs)
    .ToList();

這樣可以避免在排序期間比較兩個元素時多次調用IEnumerable.Single()和DateTime解析。

暫無
暫無

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

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