如何检查List< int []>包含一个int []元素,它存储与另一个int []相同的值?

时间:2015-10-27 19:58:27

标签: c# arrays

让我们说,我有一个整数数组列表和一个整数数组:

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;检查这里的引用,而不是值。有人可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:4)

这有效:

var contains = MyListOfIntArrays.Any(arr => arr.GetType() == MyArray.GetType() && arr.SequenceEqual(MyArray));

编辑:

正如两条评论所暗示的那样,它可以缩短为

var contains = MyListOfIntArrays.Any(arr => arr.SequenceEqual(MyArray));

答案 1 :(得分:2)

您可以使用charFindIndex

当谓词返回true时,

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>是否为会员。