排序列表<List<MyType>>

Sorting List<List<MyType>>

我有一个 "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>>();

外部列表中的每个列表在不同索引处可能有不同数量的项目,但每个列表肯定有 "Date" 个项目。

例如

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.OrderByDescending(x => x.Where(y => y.Name == "Date")).ToList(); 进行排序,但没有成功。

我还尝试通过重载 CompareTo()IComparable 实现到我的 NameValuePair 类型,但也无法使其正常工作。

欢迎提出任何建议。

假设每个内部列表只有一个名称为 Date 且格式正确的日期 Value:

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

Linq 查询采用 NameValuePairName "Date",将 Value 转换为 DateTime 对象并对此值的外部列表。

无论如何,您应该考虑用 DateTime 属性 创建一个 class。

我知道这个问题已经得到解答,但这里有一个稍微不同的方法,可能会更高效。

首先,对所有列表进行一次处理,将日期时间提取到单独的序列中:

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 解析。