C# - 根据修改日期和创建日期对字典进行排序

时间:2013-05-02 07:21:19

标签: c# linq dictionary

我在字典中有一些记录,我需要根据创建日期(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

但上述代码无效。有什么想法吗?

2 个答案:

答案 0 :(得分:8)

字典中的项目顺序未定义为the documentation

  

未定义项目的返回顺序。

如果您需要允许通过密钥进行O(1)访问的结构,请使用Dictionary<TKey, TValue> 如果您需要有序的结构,请使用List<KeyValuePair<TKey, TValue>>

之类的内容

答案 1 :(得分:0)

尝试SortedDictionary

您可以创建自己的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;
}