我上课了:
public class Item
{
public List<int> val { get; set; }
public string info { get; set; }
}
public class IndexedDictionary : KeyedCollection<List<int>, Item>
{
protected override List<int> GetKeyForItem(Item item)
{
return item.val;
}
}
在'main()'方法中:
IndexedDictionary dic = new IndexedDictionary();
dic.Add(new Item() { val = new List<int>() { 1, 2, 3 }, info = "Hello" });
dic.Add(new Item() { val = new List<int>() { 1 }, info = "Bla.." });
Console.WriteLine(dic[0].info);
Console.WriteLine(dic[new List<int>() { 1 }].info);
Console.ReadLine();
我收到了错误:
Console.WriteLine(dic[new List<int>() { 1 }].info);
你能纠正我的代码吗?全部
答案 0 :(得分:2)
你在这里犯的错误是假设List<int>
的两个实例是相同的,因为它们包含相同的int
。它们不是,它们是两个完全不同的实例。
因此,您需要做的是将new List<int>() { 1 }
分配给局部变量,并将该变量用作您的密钥。
类似的东西:
var l1 = new List<int>() { 1 };
dic.Add(new Item() { val = l1, info = "Bla.." });
答案 1 :(得分:1)
比较列表时,您的dictinary将实例(默认情况下)与序列进行比较。 例如,下面的代码将给出错误的
bool b = new List<int>() { 1 }.Equals(new List<int>() { 1 })
因此,您应该实施IEqualityComparer
。如下所示更改您的IndexedDictionary
即可。
public class IndexedDictionary : KeyedCollection<List<int>, Item>
{
public IndexedDictionary() : base(new MyEqualityComparer())
{
}
protected override List<int> GetKeyForItem(Item item)
{
return item.val;
}
public class MyEqualityComparer : IEqualityComparer<List<int>>
{
public bool Equals(List<int> x, List<int> y)
{
return x.SequenceEqual(y);
}
public int GetHashCode(List<int> obj)
{
return obj.Aggregate(0, (s, x) => s ^= x.GetHashCode());
}
}
}
答案 2 :(得分:0)
它失败了,因为您正在比较两个不同的对象。使用List<int>
作为密钥没有多大意义,因为您的字典不会关心这些列表的内容。
例如:
var list1 = new List<int>() { 1, 2, 3 };
var list2 = new List<int>() { 1, 2, 3 };
Console.WriteLine("Equals: {0}", list1 == list2);
Console.WriteLine("SequenceEquals: {0}", list1.SequenceEqual(list2));
Console.Read();
第一个是假的,第二个是真的。
有关详细信息,请参阅此问题:Is there a built-in method to compare collections in C#?