基于值而不是键对SortedDictionary进行排序

时间:2010-08-05 17:14:00

标签: c#

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

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

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

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

4 个答案:

答案 0 :(得分:11)

Sorted Dictionary将始终对键进行排序,因此无法重新排列它的数据,因此它们可以在其他任何键上排序。你可以做的是将数据放到另一个结构(某种IOrderedEnumerable)中,在那里它们可以按照键的其他东西进行排序。

如果您想丢弃密钥并获取值,那么

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

将起作用,sortedValues的类型将为IOrderedEnumerable<BusDetail>。 如果你仍然需要保留键和值,你可以这样做:

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

将返回IOrderedEnumerable<KeyValuePair<int, BusDetail>>。 你可以在这两个集合中的任何一个上foreach,或者你可以将它们绑定到网格的数据源。

答案 1 :(得分:2)

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

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

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

此时,您的keyvaluepair总线列表将按InTime

排序

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您可以使用Linq查询。

        13 => 1101
           => 0010 (one's complement)
                +1
              -----
              0011 => 3  since sign bit was 1 so s2.k = -3
              -----