数组列表中Contains()的奇怪行为

本文关键字:列表 Contains 数组 | 更新日期: 2023-09-27 18:01:01

我有一个数组列表,我需要验证列表中是否存在数组。像这样:

Guid guid1 = Guid.NewGuid();
Guid guid2 = Guid.NewGuid();
List<Guid[]> listOfArrays = new List<Guid[]>();
listOfArrays.Add(new[] { guid1, guid2});
if (listOfArrays.Contains(new[] { guid1, guid2 }))
  Console.WriteLine(@"List of Array contains guid1 and guid2");
else
  Console.WriteLine(@"List of Array does not contains guid1 and guid2");
Console.ReadKey();

输出为:

阵列列表不包含guid1和guid2

然而,如果我使用Tuple列表而不是Array,那么一切都会像我期望的一样工作

Guid guid1 = Guid.NewGuid();
Guid guid2 = Guid.NewGuid();
List<Tuple<Guid, Guid>> listOfTuples = new List<Tuple<Guid, Guid>>();
listOfTuples.Add(new Tuple<Guid, Guid>(guid1, guid2));
if (listOfTuples.Contains(new Tuple<Guid, Guid>(guid1, guid2)))
   Console.WriteLine(@"List of Tuple contains guid1 and guid2");
else
   Console.WriteLine(@"List of Tuple does not contains guid1 and guid2");
Console.ReadKey();

输出为:

元组列表包含guid1和guid2

所以我的问题是:为什么会发生这种情况?数组和元组是引用类型,它们不应该有类似的相等比较吗?如果我想使用数组,我该如何做一个在我的情况下有效的"包含"?

数组列表中Contains()的奇怪行为

数组是通过引用进行比较的,因此它不起作用。

元组覆盖Equals()以按值进行比较,因此它可以工作。