【问题标题】:Sorting a SortedDictionary based on value, not key根据值而不是键对 SortedDictionary 进行排序
【发布时间】:2010-08-05 17:13:59
【问题描述】:

我有一个 SortedDictionary,键是一个 int 值,每个键的匹配值是一个类对象。该类包含一个 int 和一个两个 datetime 变量。

我需要根据班级中的 InTime 日期时间对我的 SortedDictionary 进行排序。因此,当我执行 foreach 循环遍历我的 SortedDictionary 时,我将根据日期时间对它们进行排序。

这可能吗?我怎样才能实现它?

enter code here
 class Busdetail
    {
        public int BusNo { get; set; }
        public DateTime InTime { get; set; }
        public DateTime OutTime { get; set; }
    }

【问题讨论】:

标签: c#


【解决方案1】:

您可以使用 Linq 查询。

var D = new SortedDictionary<int, string>();
var qD = from kvp in D
         orderby kvp.Value
         select kvp
;

【讨论】:

    【解决方案2】:

    排序字典将始终按键排序,因此无法重新排列数据,因此它们会按键以外的任何内容进行排序。您可以做的是将数据放入另一个结构(某种IOrderedEnumerable)中,在该结构中可以根据键以外的内容对其进行排序。

    如果您想丢弃键并只获取值,那么

    var sortedValues = dictionary.Values.OrderBy(busDetail => busDetail.InTime);
    

    会起作用,并且 sortedValues 的类型将是 IOrderedEnumerable&lt;BusDetail&gt;。 如果您仍然需要保留键和值,您可以这样做:

    var sortedElements = dictionary.OrderBy(kvp => kvp.Value.InTime);
    

    这将返回一个IOrderedEnumerable&lt;KeyValuePair&lt;int, BusDetail&gt;&gt;。 您可以在这两个集合中的任何一个上使用 foreach,或者您可以将它们绑定到网格的数据源。

    【讨论】:

    • 每次输入或删除时要对字典进行排序?
    【解决方案3】:

    我认为您可以使用 SortedSet 和 Tuple 的键和值,例如: SortedSet> ((a,b)=>(a.Item2.CompareTo(b.Item2));

    【讨论】:

    • 这会破坏有序集合的集合属性。这导致该集合两次接受相同的值 (key = x, value = 10) (key = x, value = 5)。从某种意义上说,它破坏了集合,因为他可能想要只有唯一键的字典属性。
    【解决方案4】:

    SortedDictionary 不能按值排序,但您可以提取值的排序列表,正如其他答案所指出的那样。

    您想要做的是使用键值对列表,然后对其进行排序,如下所示:

    List<KeyValuePair<int, BusDetail>> busses = GetMyListOfBusses();
    busses.Sort((first, next) => { 
         return first.Value.InTime.CompareTo(next.Value.Intime); 
    });
    

    此时,您的总线键值对列表将按 InTime 排序

    【讨论】:

      猜你喜欢
      • 2011-01-08
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      相关资源
      最近更新 更多