繁体   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