【发布时间】:2017-02-26 13:05:31
【问题描述】:
我有一本字典,它的键是一个字符串,值是一个对象列表。我想根据 2 个因素、列表的大小和对象 ID 对其键进行排序。这些值已排序,因此列表中的第一个元素始终是最低的 id。
到目前为止,我设法使用 order by 按列表中元素的数量对其进行排序,但现在我很难根据其他因素进行排序。
示例:字典 X 包含当前键/值
["A",{2,4,5,6}]
["B",{6}]
["C",{1}]
["D",{0,1}]
["E",{0,99,88,66}]
排序后应该是
["E",{0,99,88,66}]
["A",{2,4,5,6}]
["D",{0,1}]
["C",{1}]
["B",{6}]
这是我所拥有的:
Public MyObject{
public Int Id{ get; set;}
}
var dictionary = new Dictionary<string, List<MyObject>>();
var dictionarySortedByCount = dictionary.OrderBy(x => x.Value.Count).Reverse().ToDictionary(x => x.Key, x => x.Value);
任何帮助将不胜感激。
【问题讨论】:
-
不要使用
Dictionary进行排序,因为字典的顺序没有排序。它针对查找键进行了优化。将其存储在List中。 -
在 OrderBy 中,您可以使用您喜欢的任何逻辑,因此您可以放置一个提供 IComparable 值的方法。但是,正如 Jeroen 所提到的,您通过将订单放回 Dictionary 来破坏您的订单。这个类总是像现实生活中的字典一样排序(因此得名)
-
为什么会破坏字典的顺序?我的声明不会创建新字典,按每个键中的列表大小排序吗?
-
字典未排序。字典元素有一个可以加快查找速度的键。没有指定字典使用某种排序机制工作。当您进行排序时,您不是对字典进行排序,而是对字典中的元素进行排序。结果是一个新序列(包含原始对象)。 Real LINQ 不会改变 TSource 中的序列,仅枚举元素可能会改变序列中的元素。
标签: c# linq sorting dictionary compareto