【问题标题】:Checking for an array in a list, with "List<int[]>.Contains(new int[] { .. })", always returns false使用“List<int[]>.Contains(new int[] { .. })”检查列表中的数组,始终返回 false
【发布时间】:2017-12-01 00:53:13
【问题描述】:

我正在尝试检查由 int[2] 数组组成的列表是否包含某些元素。

简而言之,为什么这会产生错误? 我怎样才能正确检查呢?

List < int[] > ngonPairs = new List<int[]> {new int[2] { 0, 1 }};

bool flag = ngonPairs.Contains(new int[2] { 0, 1 });

标志总是假的。

【问题讨论】:

  • 它包含引用等于。您有两个不同的 int[] 实例
  • 离题:你不必添加数组的长度,如果你这样创建它:new int[]{0,1} ;) 你可以删除 2 ;)跨度>

标签: c# contains


【解决方案1】:

这是因为

new[]{1, 2} != new[]{1, 2}

它们是不同的数组,对一个数组的更改不会反映在另一个数组中。

但是使用 LINQ 的 SequenceEqual,您可以比较两个序列的内容

new[]{1, 2}.SequenceEqual(new[]{1, 2}) // == true

现在,使用 LINQ 的 Any 您可以:

bool flag = ngonPairs.Any(p => p.SequenceEqual(new int[] {0, 1}));

.Any 对序列进行操作,如果序列中的任何项目满足谓词,则返回 true

在这种情况下,谓词比较来自ngonPairs 的单个项目(即数组),然后我们可以使用上述SequenceEqual 将每个数组与我们已知的数组进行比较。

【讨论】:

  • 翻译:如果 ngonPairs 的任何成员是一个元素列表,并且与我刚刚新建的这个整数数组中的元素完全相同,则将标志设置为 true。
  • 使用数组而不是列表进行搜索会更快吗?而不是 List 我会使用 int[][]?还是没那么快?
  • 数组总是比列表快,因为列表只是数组的封装。
  • @PetrasVestartas 做最明显的事情。如果它很慢,这很重要,请稍后测量。不要试图猜测你的程序会在哪里变慢。尝试使其正确
  • 列表可以增长,数组不能。如果您事先知道大小并且大小是固定的,则可以使用数组。否则使用List&lt;T&gt;
【解决方案2】:

List 包含一个数组对象,但您正试图搜索另一个新创建的对象。两个数组对象不同,所以它总是返回 false。如果你的意图是比较数组的值,你可以使用 EqualityComparer 来检查。

编写一个比较器来比较两个数组。以下代码 sn-p 是示例,它将仅比较大小为 2 的 int 数组。

class ArrayComparer : EqualityComparer<int[]>
    {
        public override bool Equals(int[] x, int[] y)
        {

            if (x[0] == y[0] && x[1] == y[1])
                return true;
            else
                return false;
        }

        public override int GetHashCode(int[] obj)
        {
            throw new NotImplementedException();
        }
    }

然后在 Contains 函数中使用这个 EqualityComparer 实例来比较数组值;

bool flag = ngonPairs.Contains(new int[2] { 0, 1 }, new ArrayComparer());

【讨论】:

  • 理论上是正确的,尽管当我有超过 2 个项目的数组时,我不想被这个 API 欺骗。
  • 这只是一个示例,如果给定的两个数组对象的大小不同,则可以对其进行增强以处理大于 2 的数组和所需的验证。
  • public override bool Equals(int[] x, int[] y) { return Enumerable.SequenceEquals(x, y); } =^_^=
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 2015-12-29
相关资源
最近更新 更多