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)
它基于当前的实现,但不能保证跨实现.除非您使用SortedDictionary,或者如果您更改最后一个foreach循环以迭代dict.OrderBy(pair => pair.Key),则无法保证顺序.
出于枚举的目的,字典中的每个项都被视为表示值及其键的KeyValuePair结构.返回项的顺序未定义.