我在字典中有一些记录,我需要根据创建日期(CDate)和修改日期(MDate)对数据进行排序。在创建记录时,我的CDate将具有当前日期时间,但MDate将是1/1/0001 12:00:00 AM。
这是用于排序的示例数据和代码。
CDate MDate
4/30/2013 4:43:41 PM 4/30/2013 4:46:47 PM
4/30/2013 4:43:28 PM 4/30/2013 4:46:36 PM
4/30/2013 4:43:54 PM 4/30/2013 4:46:16 PM
4/30/2013 5:03:13 PM 1/1/0001 12:00:00 AM
代码:
FileSchedulerEntities = FileSchedulerEntities
.OrderByDescending(pair => pair.Value.MDate)
.ThenByDescending(pair => pair.Value.CDate)
.ToDictionary(pair => pair.Key, pair => pair.Value);
根据排序,我需要按照这样的降序排序数据
CDate MDate
4/30/2013 5:03:13 PM 1/1/0001 12:00:00 AM
4/30/2013 4:43:41 PM 4/30/2013 4:46:47 PM
4/30/2013 4:43:28 PM 4/30/2013 4:46:36 PM
4/30/2013 4:43:54 PM 4/30/2013 4:46:16 PM
但上述代码无效。有什么想法吗?
答案 0 :(得分:8)
字典中的项目顺序未定义为the documentation:
未定义项目的返回顺序。
如果您需要允许通过密钥进行O(1)访问的结构,请使用Dictionary<TKey, TValue>
如果您需要有序的结构,请使用List<KeyValuePair<TKey, TValue>>
。
答案 1 :(得分:0)
您可以创建自己的ToSortedDictionary&lt;(此IEnumerable源,Func keySelector,Func elementSelector,IEqualityComparer比较器):
public static SortedDictionary<TKey, TElement> ToSortedDictionary<TSource, TKey, TElement>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
Func<TSource, TElement> elementSelector,
IEqualityComparer<TKey> comparer)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (keySelector == null)
{
throw Error.ArgumentNull("keySelector");
}
if (elementSelector == null)
{
throw Error.ArgumentNull("elementSelector");
}
var dictionary = new SortedDictionary<TKey, TElement>(comparer);
foreach (TSource local in source)
{
dictionary.Add(keySelector(local), elementSelector(local));
}
return dictionary;
}