在Arue Queue上使用Contains时,Console返回False。为什么?

时间:2014-10-05 17:05:56

标签: c# arrays queue contains

我创建了一个程序,其中我有一个int数组队列:

Queue< int[] > Test = new Queue< int[] >();

给定一个数组,我想检查数组是否在队列中。

我目前使用的命名空间是:System,System.Collections和System.Collections.Generic。

我试过这样的事情:

Queue<int[]> Test = new Queue<int[]>();

Test.Enqueue(new int[] { 20, 20 });

Console.WriteLine( Test.Contains(new int[] { 20, 20 }) ); // Is the array {20,20} inside the queue?

在这段代码中,在我看来,控制台将输出“true”,因为我将数组{20,20}添加到队列中,现在我正在使用Contains方法进行检查。

但是当我运行代码时 - 控制台输出错误。

我有两个问题: 为什么会这样?我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

因为数组是引用类型,所以比较将基于引用。即使内容相同,您的数组也会有不同的引用。这就是 false 的原因。

要解决此问题,您可以实现自定义比较器,或者您可以使用LINQ方法,例如

bool arrayExists = Test.Any(x => x.SequenceEqual(new[] { 20, 20 }));

答案 1 :(得分:1)

Contains()使用类型的默认比较器。对于数组,它比较数组引用,而不是内容。您需要创建自定义相等比较器。

这样的事情:

class ArrayComparer : IEqualityComparer<int[]>
{
    public bool Equals(int[] x, int[] y)
    {
        return x.SequenceEqual(y);
    }

    public int GetHashCode(int[] obj)
    {
        int h = 0;

        foreach (int item in obj)
        {
            h = (h << 5) + 3 + h ^ item.GetHashCode();
        }

        return h;
    }
}

Test.Contains(new int[] { 20, 20 }, new ArrayComparer())

答案 2 :(得分:0)

默认情况下,数组通过引用进行比较,而不是内容。解决此问题的一种方法是存储列表而不是数组,这将比较内容。您可以在添加到队列之前将数组转换为列表,如果重要,则可以在将它们取出后再将其转换回来。