-1

我有课:

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);

你能纠正我的代码吗?全部

4

3 回答 3

2

您在这里犯的错误是假设 a 的两个实例List<int>相同,因为它们包含相同的int. 它们不是,它们是两个完全不同的实例。

因此,您需要做的是将 分配new List<int>() { 1 }给局部变量,并将该变量用作您的键。

就像是:

var l1 = new List<int>() { 1 };
dic.Add(new Item() { val = l1, info = "Bla.." });
于 2012-11-14T14:36:52.467 回答
1

比较列表时,您的字典会比较实例(默认情况下)而不是序列。例如,下面的代码将给出错误

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());
        }
    }
}
于 2012-11-14T14:44:53.347 回答
0

它失败了,因为您正在比较两个不同的对象。使用 as 键没有多大意义,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();

第一个是假的,第二个是真的。

有关更多信息,请参阅此问题:C# 中是否有比较集合的内置方法?

于 2012-11-14T14:52:26.407 回答