在 C# 中,将 List 转换为 SortedDictionary

本文关键字:string 最佳 方法 是什么 SortedDictionary List 转换 | 更新日期: 2023-09-27 18:17:41

我有一个列表中的特殊事件对象列表

List<SpecialEvent>

我想将其转换为排序字典,其中键是 SpecialEvent.Date,值是 SpecialEvent 对象

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

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

但这会转换为排序词典而不是常规词典

在 C# 中,将 List<T> 转换为 SortedDictionary<string 的最佳方法是什么,T>

您可以使用 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));
}
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);
请注意

SortedDictionary不支持重复键。如果您有两个或多个事件具有相同的日期,您最终会得到一个ArgumentException,上面写着:具有相同键的条目已经存在。

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

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

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