【问题标题】:Sort dictionary based on 2 factors基于 2 个因素对字典进行排序
【发布时间】: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


【解决方案1】:

您是否尝试在第一个订单条件之后添加另一个订单条件,如下所示?

var dictionarySortedByCount = dictionary
        .OrderByDescending(x => x.Value.Count)
        .ThenBy(x => x.Value[0].ObjectId)
        .ToDictionary(x => x.Key, x => x.Value);

【讨论】:

  • 不,但我想试试这个 var dictionarySortedByCount = dictionary .OrderByDescending(x => x.Value.Count) .ThenBy(x => x.Value[0].ObjectId) .ToDictionary(x => x.Key, x => x.Value);
  • 好奇...使用 ObjectId 进行排序有什么具体原因吗?
  • 你说得对!我认为第二个条件是字典键:p。如果可行,请告诉我,以便我编辑答案。
  • @ChetanRanpariya 我正在尝试根据字典键包含的元素数量对字典键进行排序,但是我想要一个特殊情况条件,如果元素计数相同,则 ID 最低使用,使键值对成为第一个
  • @RajmondBurgaj 我正在测试中:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 2015-05-02
  • 2014-05-26
  • 1970-01-01
相关资源
最近更新 更多