排序列表<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
查询采用 NameValuePair
和 Name
"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 解析。
我有一个 "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
查询采用 NameValuePair
和 Name
"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 解析。