当元素存在时,List.Contains不返回true

时间:2015-02-20 23:16:50

标签: c# list

我有一点问题。

我有一个int数组列表,其中包含ID(任意数字)和Count(可以是0到5之间的任何内容),其名称为playerWordList,第二个列表的ID仅包含名称words }。我试图做的是一个函数,它检查第二个列表中的每个ID是否存在于第一个(计数没有关系),如果它不存在,则添加具有该缺失ID的元素,并且Count等于0

目前,我有一个解决方法,这是双循环,对于第二个列表中的每个元素迭代遍历第一个列表中的每个元素寻找匹配,但我发现有一个方法List.Contains在我的问题中完全匹配,但它无法正常工作。

我读了一些关于它的SO主题,但它们主要关注比较自定义类的两个元素,这两个元素需要覆盖EqualsGetHashCode,但我不知道它是否是以任何方式适用于我的问题,如果确实如此,那么我不知道如何为int数组覆盖EqualsGetHashCode

这是我的代码:

foreach (var word in unit.words)
{
    int[] ex1 = new int[2] { word.id, 0 };
    int[] ex2 = new int[2] { word.id, 1 };
    int[] ex3 = new int[2] { word.id, 2 };
    int[] ex4 = new int[2] { word.id, 3 };
    int[] ex5 = new int[2] { word.id, 4 };
    int[] ex6 = new int[2] { word.id, 5 };

    if (playerWordList.Contains(ex1) ||
        playerWordList.Contains(ex2) ||
        playerWordList.Contains(ex3) ||
        playerWordList.Contains(ex4) ||
        playerWordList.Contains(ex5) ||
        playerWordList.Contains(ex6)) break;
    else
    {
        int[] newWord = new int[2] { word.id, 0 };

        playerWordList.Add(newWord);
    }
}

2 个答案:

答案 0 :(得分:0)

包含对引用相等性的检查。所以这些对象实例应该是相同的。 不检查 值相等。我怀疑你在其他地方插入ex1(2,3,4,5)的其他实例,并且由于引用不相等而包含不返回true。

希望这能澄清一些事情。

这将有效:

int[] ex1 = new int[2] { word.id, 0 };
playerWordList.Insert(ex1)
if(playerWordList.Contains(ex1))
  // returns true

但是如果您在其他地方创建并插入ex1并将其放入playerWordList然后在您的foreach中创建ex对象的“新”实例,那么这些实例实际上是对不同对象的不同引用(尽管具有相同的值) ,但Contains不比较值而是引用;)

答案 1 :(得分:0)

您无法覆盖内置类型的GetHashCodeEquals方法,但您可以为int[]实施IEqualityComparer并将其传递给{{ 3}}方法。这通常是要走的路,但如果你想要一个快速的方法,你只需使用Any方法SequenceEqual

if(playerWordList.Any(x => x.SequenceEqual(ex1) ||
                           x.SequenceEqual(ex2) ||
                           x.SequenceEqual(ex3) ||
                           x.SequenceEqual(ex4) ||
                           x.SequenceEqual(ex5) ||
                           x.SequenceEqual(ex6))