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

C# 当元素存在时,List.Contains不返回true,c#,list,C#,List,我有个小问题 我有一个int数组的列表,它包含ID为任意数字和计数的数组,可以是0到5之间的任何数组,名为playerWordList,第二个数组的ID仅包含名称词。我试图做的是一个函数,它检查第二个列表中的每个ID是否出现在第一个计数中并不重要,如果它不存在,则添加缺少ID且计数等于0的元素 目前,我有一个解决方法,即双循环,第二个列表中的每个元素都会遍历第一个列表中的每个元素,以查找匹配项,但我看到有一个方法列表。Contains在我的问题中完全匹配,但它不能正常工作 我读了一些关于它的主题

我有个小问题

我有一个int数组的列表,它包含ID为任意数字和计数的数组,可以是0到5之间的任何数组,名为playerWordList,第二个数组的ID仅包含名称词。我试图做的是一个函数,它检查第二个列表中的每个ID是否出现在第一个计数中并不重要,如果它不存在,则添加缺少ID且计数等于0的元素

目前,我有一个解决方法,即双循环,第二个列表中的每个元素都会遍历第一个列表中的每个元素,以查找匹配项,但我看到有一个方法列表。Contains在我的问题中完全匹配,但它不能正常工作

我读了一些关于它的主题,但他们主要关注于比较定制类的两个元素,这需要重写Equals和GetHashCode,但我不知道它是否以任何方式适用于我的问题,如果是,那么我不知道如何重写int数组的Equals和GetHashCode

这是我的密码:

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);
    }
}
包含对引用相等性的检查。所以这些对象实例应该是相同的。它不检查值是否相等。我怀疑您在其他地方插入了ex12,3,4,5的其他实例,而contains由于引用不相等而没有返回true

希望这能澄清一些事情

这将有助于:

int[] ex1 = new int[2] { word.id, 0 };
playerWordList.Insert(ex1)
if(playerWordList.Contains(ex1))
  // returns true
但是,如果您在其他地方创建并插入ex1,并将其放入PlayerOrdList,然后在foreach中创建ex对象的新实例,则这些实例实际上是对不同对象的不同引用,虽然具有相同的值,但包含的值不比较值,而是引用

对于内置类型,您不能重写GetHashCode和Equals方法,但可以实现for int[]并将其传递给方法。这通常是一种方法,但如果您想要一种快速方法,您可以简单地使用SequenceEqual的任何方法:


所以如果我理解正确的话,Contains方法在我的例子中通常是无用的,除非我重写/修改它,对吗?x=>x.SequenceEqualex1是什么东西?我经常看到它,但我不能搜索它,因为它里面唯一的东西就是箭头,它似乎有用SequenceEqual检查两个序列是否有相同顺序的相同元素。好的,但我问的是=>。它是LINQ吗?它用于创建lambda表达式。
if(playerWordList.Any(x => x.SequenceEqual(ex1) ||
                           x.SequenceEqual(ex2) ||
                           x.SequenceEqual(ex3) ||
                           x.SequenceEqual(ex4) ||
                           x.SequenceEqual(ex5) ||
                           x.SequenceEqual(ex6))