我创建了一个程序,其中我有一个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方法进行检查。
但是当我运行代码时 - 控制台输出错误。
我有两个问题: 为什么会这样?我该如何解决这个问题?
答案 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)
默认情况下,数组通过引用进行比较,而不是内容。解决此问题的一种方法是存储列表而不是数组,这将比较内容。您可以在添加到队列之前将数组转换为列表,如果重要,则可以在将它们取出后再将其转换回来。