在C#中,将List <t>转换为SortedDictionary <string,t =“”>?</string,> </t>的最佳方法是什么?

时间:2013-06-09 12:46:04

标签: c# collections sorteddictionary

我在列表中有一个SpecialEvent对象列表

List<SpecialEvent>

我希望将它转换为一个排序字典,其中键是SpecialEvent.Date,值是SpecialEvent对象

我基本上想要这样的东西:

list.ToDictionary(r=>r.Date, r=>r)

但是转换为排序字典而不是常规字典

3 个答案:

答案 0 :(得分:7)

您可以使用SortedDictionary的构造函数:

var dict = new SortedDictionary<string, SpecialEvent>(list.ToDictionary(r => r.Date, r => r));

或者,作为通用方法:

public static SortedDictionary<T1,T2> ToSortedDictionary<Tin,T1,T2>(this List<Tin> source, Func<Tin,T1> keyselector, Func<Tin,T2> valueselector)
{
    return new SortedDictionary<T1,T2>(source.ToDictionary(keyselector, valueselector));
}

答案 1 :(得分:4)

public static SortedDictionary<TKey, TValue> ToSortedDictionary<TKey, TValue>(this IEnumerable<TValue> seq, Func<TValue, TKey> keySelector)
{
    var dict = new SortedDictionary<TKey, TValue>();
    foreach(TValue item in seq)
    {
        dict.Add(keySelector(item), item);
    }

    return dict;
}

然后您可以将其用作

SortedDictionary<DateTime, SpecialEvent> sortedEvents = list.ToSortedDictionary(r => r.Date);

答案 2 :(得分:0)

请注意,SortedDictionary不支持重复密钥。如果您有两个或更多具有相同日期的活动,则最终会得到ArgumentException说:具有相同密钥的条目已存在。

因此,更好的方法可能只是对事件列表进行排序:

list.Sort((a, b) => a.Date.CompareTo(b.Date));

这将对您的活动进行有效的就地快速排序。结果是事件列表按日期按升序排序。