gpt4 book ai didi

c# - 如何在 C# 中使用原始列表或列表作为字典的键

转载 作者:太空宇宙 更新时间:2023-11-03 19:00:47 26 4
gpt4 key购买 nike

我正在尝试使用 int 数组作为 C# 中的键,但我看到的行为是出乎意料的(对我而言)。

var result = new Dictionary<int[], int>();
result[new [] {1, 1}] = 100;
result[new [] {1, 1}] = 200;

Assert.AreEqual(1, result.Count); // false is 2

List 好像也一样

var result = new Dictionary<List<int>, int>();
result[new List<int> { 1, 1 }] = 100;
result[new List<int> { 1, 1 }] = 200;

Assert.AreEqual(1, result.Count); // false is 2

我希望 Dictionary 使用 Equals 来决定 map 中是否存在 Key。事实并非如此。

有人可以解释为什么以及如何让这种行为起作用吗?

最佳答案

.NET 列表和数组没有内置的相等比较,因此您需要提供自己的:

class ArrayEqComparer : IEqualityComparer<int[]> {

public static readonly IEqualityComparer<int[]> Instance =
new ArrayEqComparer();

public bool Equals(int[] b1, int[] b2) {
if (b2 == null && b1 == null)
return true;
else if (b1 == null | b2 == null)
return false;
return b1.SequenceEqual(b2);
}

public int GetHashCode(int[] a) {
return a.Aggregate(37, (p, v) => 31*v + p);
}
}

现在您可以按如下方式构建字典:

var result = new Dictionary<int[],int>(ArrayEqComparer.Instance);

关于c# - 如何在 C# 中使用原始列表或列表作为字典的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36392631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com