为什么将手动添加到 C# 字典的项目添加到字典的 beginning/end?
Why are manually added items to C# dictionary added to beginning/end of dictionary?
在我的词典中使用 Oxyplot,我希望我的用户可以选择颜色。要用所有 Oxycolors 填充相应的组合框,我有以下功能:
...
public Dictionary<string, OxyColor> AllOxyColors { get; set; }
...
/// <summary>
/// Creates a Dictionary from the fields of the OxyColorsclass
/// </summary>
private void InitializeAllOxyColors()
{
var colorsValues = typeof(OxyColors)
.GetFields(BindingFlags.Static | BindingFlags.Public)
.Where(f => f.FieldType == typeof(OxyColor))
.Select(f => f.GetValue(null))
.Cast<OxyColor>()
.ToList();
var colorsNames = typeof(OxyColors)
.GetFields(BindingFlags.Static | BindingFlags.Public)
.Where(f => f.FieldType == typeof(OxyColor))
.Select(f => f.Name)
.Cast<string>()
.ToList();
AllOxyColors = colorsNames.Zip(colorsValues, (k, v) => new { k, v }).ToDictionary(x => x.k, x => x.v);
AllOxyColors.Remove("Undefined");
AllOxyColors.Remove("Automatic");
// Manually added colors for colorblind colleagues
AllOxyColors.Add("#DE1C1C", OxyColor.Parse("#DE1C1C"));
AllOxyColors.Add("#13EC16", OxyColor.Parse("#13EC16"));
AllOxyColors.Add("#038BFF", OxyColor.Parse("#038BFF"));
// ordering doesn't seem do anything on the dictionary here:
//AllOxyColors.OrderBy(c => c.Key);
}
如您所见,有一个部分是我手动添加三种颜色的,这是色盲同事要求的。问题是,由于某种原因,前两种颜色被添加到列表的顶部,第三种颜色被添加到列表的末尾。使用 OrderBy()
似乎对字典也没有任何影响。
这种行为的原因是什么?
OrderBy returns IOrderedEnumerable<TSource>
它不会对您现有的字典进行排序,因此您必须执行类似
的操作
AllOxyColors = AllOxyColors.OrderBy(x => x.Key).ToDictionary(pair => pair.Key, pair => pair.Value);
在我的词典中使用 Oxyplot,我希望我的用户可以选择颜色。要用所有 Oxycolors 填充相应的组合框,我有以下功能:
...
public Dictionary<string, OxyColor> AllOxyColors { get; set; }
...
/// <summary>
/// Creates a Dictionary from the fields of the OxyColorsclass
/// </summary>
private void InitializeAllOxyColors()
{
var colorsValues = typeof(OxyColors)
.GetFields(BindingFlags.Static | BindingFlags.Public)
.Where(f => f.FieldType == typeof(OxyColor))
.Select(f => f.GetValue(null))
.Cast<OxyColor>()
.ToList();
var colorsNames = typeof(OxyColors)
.GetFields(BindingFlags.Static | BindingFlags.Public)
.Where(f => f.FieldType == typeof(OxyColor))
.Select(f => f.Name)
.Cast<string>()
.ToList();
AllOxyColors = colorsNames.Zip(colorsValues, (k, v) => new { k, v }).ToDictionary(x => x.k, x => x.v);
AllOxyColors.Remove("Undefined");
AllOxyColors.Remove("Automatic");
// Manually added colors for colorblind colleagues
AllOxyColors.Add("#DE1C1C", OxyColor.Parse("#DE1C1C"));
AllOxyColors.Add("#13EC16", OxyColor.Parse("#13EC16"));
AllOxyColors.Add("#038BFF", OxyColor.Parse("#038BFF"));
// ordering doesn't seem do anything on the dictionary here:
//AllOxyColors.OrderBy(c => c.Key);
}
如您所见,有一个部分是我手动添加三种颜色的,这是色盲同事要求的。问题是,由于某种原因,前两种颜色被添加到列表的顶部,第三种颜色被添加到列表的末尾。使用 OrderBy()
似乎对字典也没有任何影响。
这种行为的原因是什么?
OrderBy returns IOrderedEnumerable<TSource>
它不会对您现有的字典进行排序,因此您必须执行类似
AllOxyColors = AllOxyColors.OrderBy(x => x.Key).ToDictionary(pair => pair.Key, pair => pair.Value);