嗨,我正在嘗試使用Dictionary帶有整數串列的 a 作為鍵,其中串列中值的順序應該很重要。因此,如果 a 有這樣的事情:
List<int> list1 = new List<int>();
list1.Add(1);
list1.Add(2);
list1.Add(3);
List<int> list2 = new List<int>();
list2.Add(1);
list2.Add(2);
list2.Add(3);
Dictionary<List<int>,int> dictionary = new Dictionary<List<int>,int>();
dictionary.Add(list2 , 100);
我希望能夠訪問字典中的值list2。所以就功能而言,我希望它的作業方式類似于
Enumerable.SequenceEqual(list1, list2)
uj5u.com熱心網友回復:
您應該Dictionary使用接受IEqualityComparer.
在實作中,除了標準相等之外,IEqualityComparer您還應該使用/ 來代替。SequenceEqual
示例(在 C# PlayGround 上):
public class EnumerableComparer<T> : IEqualityComparer<IEnumerable<T>>
{
public bool Equals(IEnumerable<T> x, IEnumerable<T> y)
{
return Object.ReferenceEquals(x, y) || (x != null && y != null && x.SequenceEqual(y));
}
public int GetHashCode(IEnumerable<T> obj)
{
unchecked
{
return obj.Where(e => e != null).Select(e => e.GetHashCode()).Aggregate(17, (a, b) => 23 * a b);
}
}
}
var key1 = new List<int> { 1, 3, 5 };
var key2 = new List<int> { 2, 4, 6 };
var key3 = new List<int> { 1, 3, 5 };
var comparer = new EnumerableComparer<int>();
var dictionary = new Dictionary<List<int>, string>(comparer);
dictionary.Add(key1, "hello");
dictionary.Add(key2, "world");
Console.WriteLine(dictionary[key3]); // prints "hello"
資訊:一項快速研究表明,Dictionary至少從 .NET Framework 2.0 開始就可以使用上述建構式。它在所有版本中都可用,直到最新版本(在撰寫本文時:.NET 6)。
更新(2022-03-25):重命名IEnumerableComparer為EnumerableComparer
uj5u.com熱心網友回復:
最簡單的解決方案是將ints 串列序列化為string.
例如:
Dictionary<string,int> dictionary = new Dictionary<string,int>();
dictionary.Add(string.Join(",", list2), 100);
您可以做一個不那么棘手的事情,您可以定義自己的類來封裝串列并正確實作GetHashCode()和Equals(). 重要:你需要小心這個類,因為串列是可變的。如果在將專案添加到字典后將某些內容插入到串列中,您將不會得到預期的行為:
例如:
List<int> list1 = new List<int>();
list1.Add(1);
list1.Add(2);
list1.Add(3);
MyListWrapper wrapper1 = new MyListWrapper(list1);
List<int> list2 = new List<int>();
list2.Add(1);
list2.Add(2);
list2.Add(3);
MyListWrapper wrapper2 = new MyListWrapper(list2);
Dictionary<MyListWrapper,int> dictionary = new Dictionary<MyListWrapper,int>();
dictionary.Add(wrapper1, 100);
Assert.AreEqual(100, dictionary[wrapper2]); // this will work
list1.Add(5);
list2.Add(5);
Assert.AreEqual(100, dictionary[wrapper2]); // this will NOT work
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/451093.html
