带有列表<int> </int>的索引字典

时间:2012-11-14 14:32:54

标签: c#

我上课了:

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

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

3 个答案:

答案 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#?