让我们说,我有一个整数数组列表和一个整数数组:
List<int[]> MyListOfIntArrays = new List<int[]>
{
new int[1] {0},
new int[2] {0,1},
new int[2] {1,0}
};
int[] MyArray = new int[]{1, 0};
我想知道如何检查MyListOfIntArrays中是否存储与MyArray相同的值。 在这种情况下,答案应该是:&#34;是&#34; (MyListOfIntArrays的第三个元素存储与MyArray相同的值。)
我的尝试:
if (MyListOfIntArrays.Contains(MyArray) == true)
Console.WriteLine("Yes");
if (MyListOfIntArrays.Contains(MyArray) == false)
Console.WriteLine("No");
始终返回否。 我是C#的新手,我的猜测是方法&#34;包含&#34;检查这里的引用,而不是值。有人可以帮我解决这个问题吗?
答案 0 :(得分:4)
这有效:
var contains = MyListOfIntArrays.Any(arr => arr.GetType() == MyArray.GetType() && arr.SequenceEqual(MyArray));
编辑:
正如两条评论所暗示的那样,它可以缩短为
var contains = MyListOfIntArrays.Any(arr => arr.SequenceEqual(MyArray));
答案 1 :(得分:2)
您可以使用char
和FindIndex
。
SequenceEqual
将返回给定数组的索引(FindIndex
)。如果它找不到任何东西,它将返回-1。
MyListOfIntArrays
将逐元素检查数组的相等性,而不是检查SequenceEqual
通常执行的引用(因为它使用默认比较器,并且数组由ref检查。另一种方法是使用自定义比较器显示by Servy)。
Contains
如果你不需要索引,你可能想要简单。 if (MyListOfIntArrays.FindIndex(x => x.SequenceEqual(MyArray)) != -1) // if != -1 means we found array!
Console.WriteLine("Yes");
else
Console.WriteLine("No");
将给出一个布尔值,并由Asad Saeeduddin评论:
Any
答案 2 :(得分:0)
数组为自己定义的相等性仅检查数组是否引用相同的对象;它不会检查数组的内容是否相同。如果要根据它们的值比较它们,则需要创建一个可以比较数组值的比较器:
public class SequenceComparer<T> : IEqualityComparer<IEnumerable<T>>
{
private IEqualityComparer<T> comparer;
public SequenceComparer(IEqualityComparer<T> comparer = null)
{
comparer = comparer ?? EqualityComparer<T>.Default;
}
public bool Equals(IEnumerable<T> x, IEnumerable<T> y)
{
return x.SequenceEqual(y, comparer);
}
public int GetHashCode(IEnumerable<T> sequence)
{
unchecked
{
int hash = 19;
foreach (var item in sequence)
hash = hash * 79 + comparer.GetHashCode(item);
return hash;
}
}
}
这可以让你写:
if (MyListOfIntArrays.Contains(MyArray, new SequenceComparer<int>()))
Console.WriteLine("Yes");
else
Console.WriteLine("No");
答案 3 :(得分:-1)
.Contains
将不起作用,因为数组是引用类型,只有在MyArray
指向列表的数组而不是相同的数组时,才会生效。
虽然您可以使用针对所有阵列的元素比较来解决您的问题,但我觉得更好的解决方案是使用集合而不是数组。如果您使用ISet<ISet<int>>
代替List<int[]>
,则可以非常轻松有效地检查给定的ISet<int>
是否为会员。