Enumerable.First()当您在Dictionary集合的实例上调用它时,.NET 3.5扩展方法的含义是什么?
密钥集是确定哪个项目是第一个,还是仅仅未定义?
假设我们有一个
var dictionary= new Dictionary<int, IList<int>>();
Run Code Online (Sandbox Code Playgroud)
我想要的是输出它的排序版本,首先按键排序,然后按列表中的值排序.
例如
1 2, 1, 6
5 2, 1
2 1, 3
Run Code Online (Sandbox Code Playgroud)
变
1 1, 2, 6
2 1, 3
5 1, 2
Run Code Online (Sandbox Code Playgroud)
我尝试在里面做foreach,但显然改变你正在迭代的东西是个坏主意.
与下面的类似问题已被问到,具体参考此处的字典:Dictionary<TKey, TValue> 的枚举器是否按添加顺序返回键值对?这里:字典枚举顺序
阅读这些内容可以清楚地看出,不应依赖 Dictionary 的枚举顺序。根据字典枚举的非确定性顺序,我最近观察到,当针对 .NET Core 3.1(在分支中)构建测试项目时,单元测试间歇性失败(在构建机器上)。相比之下,针对 .NET Framework 4.7.2(在不同分支上)构建的同一测试项目没有失败。这些观察结果是在许多单独的单元测试执行中得出的。最终,我将失败追溯到数值运算(超过 1/x 的求和),其中值(x)存储在以String. 在单元测试的情况下,求和的顺序会影响结果。计算中已应用修复:使用 ImmutableSortedDictionary。
这里有一个简化的代码片段,演示了不同的键顺序ImmutableDictionary(针对 .NET Core 3.1 进行编译并执行多次以观察不同的枚举):
static void Main(string[] args)
{
var dict = ImmutableDictionary<string,double>.Empty;
for (int i = 0; i < 10; i++)
{
dict = dict.Add(i.ToString(),i);
}
Console.WriteLine("Keys collection: " + string.Join(", ",dict.Keys.ToList()));
Console.WriteLine("Keys during enumeration: " +string.Join(", ", dict.Select(c => c.Key).ToList()));
}
Run Code Online (Sandbox Code Playgroud)
但是,正如有关以下问题的答案中所指出的Dictionary:“aDictionary确实以相同的顺序返回项目(假设您没有触发哈希表的大小调整)”。同样,我知道不应依赖当前的排序行为,但不清楚在什么情况下(例如,使用 .NET Framework、.NET Standard、.NET Core 时)执行之间的排序实际上有所不同。我的问题是:
为什么 ImmutableDictionary(在 .NET …
假设我有一个字典,然后调用.Keys,然后调用.Values,没有干预操作.密钥的排序是否与值的排序一致?
换句话说,第n个键是否与字典中之前的第n个值相对应?
按照相同的顺序,我的意思不是添加键的顺序相同!
说,
1) 我有一本字典 d
2) 我添加 2, 4, 6 作为我的键
3) 现在我通过 d.Keys 属性访问它
现在按照相同的顺序,我的意思是,如果我不断重复步骤 2 和 3。
d.Keys 是否总是以相同的顺序返回键 4、2、6。
鉴于每次都以相同的顺序添加相同的一组键(2,4,6)!
基本上是在字典中添加键是一个确定性的过程?
我已经运行了一些随机样本,看起来Dictionary.Keys 属性每次都为同一组键返回相同的序列。
但是有保证吗?
我试过的示例代码
public static void Main(string[] args)
{
var rand = new Random();
var fixedKeys = Enumerable.Range(1, 100000).Select(x => rand.Next(10000000)).Distinct().ToList();
var dic = new Dictionary<int, string>();
foreach (var item in fixedKeys)
{
dic.Add(item, "");
} …Run Code Online (Sandbox Code Playgroud) 我使用C#已经有10多年了,但今天我发现Dictionary<string, int>保留了插入顺序?据我所知,Dictionary内部是使用哈希表实现的,所以内部排列应该没有特定的顺序,但是下面的测试代码似乎显示遍历时的顺序和插入的顺序是一模一样的?
const int N = 1000000;
List<string> ss = new List<string>();
Dictionary<string, int> dict = new Dictionary<string, int>();
for (int i = 0; i < N; ++i)
{
var s = string.Empty;
for (int j = 0; j < 15; ++j)
s += (char)('a' + UnityEngine.Random.Range(0, 26));
//ss.add(s);
ss.Add(new string(s));
//dict[s] = UnityEngine.Random.Range(0, 1024);
dict.Add(s, UnityEngine.Random.Range(0, 1024));
}
int same = 0;
var keys = dict.Keys.ToArray();
for (int i = 0; i < N; ++i) …Run Code Online (Sandbox Code Playgroud)