排序.NET字典 - 错误或不支持的功能?

Eri*_*art 0 .net sorting dictionary

我最近发现了生产代码,包括.NET的排序Dictionary<string,CustomObject>.它基本上是将字典复制到临时字典,然后.Clear()原始并插入通过Linq表达式排序的KeyValuePairs,通过CustomObjects中的DateTime值.

我希望这段代码不起作用,并且已经删除它,期望无法对字典(以及HashSet)进行排序.然后我编写了以下测试代码,令我惊讶的是,当使用foreach循环迭代时,它显示了字典中的排序输出.

这是当前实现中的随机效果Dictionary<TKey, TValue>,可能在当前情况下有效,但在另一个.NET实现中失败了吗?或者它是.NET Dictionaries中使用的标准功能?

我仍然认为生产代码有缺陷,但工作正常.我是否应该将其删除,需要进行长时间的测试,如果订单是在我找到分拣程序的地方以外的地方使用的,或者是否可以安全地保留原样?

这是我的测试代码:

static void Main(string[] args)
{
    var rnd = new Random();
    var dict = new Dictionary<int, string>();
    for (int i = 0 ; i < 10 ; i++)
    {
        int rndValue;
        do
        {
            rndValue = rnd.Next(100);
        }
        while (dict.ContainsKey(rndValue));

        dict.Add(rndValue, "MyValue#" + i);
    }

    foreach (KeyValuePair<int, string> pair in dict)
    {
        Console.WriteLine("Key: " + pair.Key + ", Value: " + pair.Value);
    }

    Console.Write("Enter...");
    Console.ReadLine();

    var dictBuff = dict.ToDictionary(p => p.Key, p => p.Value);
    dict.Clear();

    var sortdict = from pair in dictBuff orderby pair.Key ascending select pair;

    foreach (KeyValuePair<int, string> pair in sortdict)
    {
        dict.Add(pair.Key, pair.Value);
    }

    Console.WriteLine("'Sorted' Dictionary:");

    foreach (KeyValuePair<int, string> pair in dict)
    {
        Console.WriteLine("Key: " + pair.Key + ", Value: " + pair.Value);
    }

    Console.Write("Enter...");
    Console.ReadLine();

}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ett 5

它基于当前的实现,但不能保证跨实现.除非您使用SortedDictionary,或者如果您更改最后一个foreach循环以迭代dict.OrderBy(pair => pair.Key),则无法保证顺序.

从文档(备注部分):

出于枚举的目的,字典中的每个项都被视为表示值及其键的KeyValuePair结构.返回项的顺序未定义.