【问题标题】:One way to compare array比较数组的一种方法
【发布时间】:2009-09-15 17:05:36
【问题描述】:

我想知道我下面比较字符串数组(或任何简单类型)的方法是否会对性能产生影响。

bool AreValuesEqual(List<string> oldFieldValue, List<string> newFieldValue)
    {
        if (oldFieldValue.Count != newFieldValue.Count)
            return false;

        var list1 = oldFieldValue;
        list1.AddRange(newFieldValue);
        var list2 = list1.Distinct();
        return list2.Count() == newFieldIds.Count;
    }

我不知道 Distinct() 会为此有多密集,但我认为与另一个循环相比,它不应该太多。

编辑 - 抱歉,应该提供更多背景信息。几件事:

-参数数组中不会有重复。

-我并不关心顺序,我只想知道一个数组中的值是否与另一个数组相同。如果另一个数组有不同的值,则返回 false。

【问题讨论】:

  • 您知道 SequenceEquals 扩展吗?要获得您的功能,您首先必须订购列表。
  • 另外,您可能需要检查 null。

标签: c# linq arrays


【解决方案1】:

我认为您的代码没有严重的性能问题。但是,让我有点困扰的是,您正在修改 list1 作为进行比较的副作用。

下面的工作会更好吗?

if(list1.Count == list2.Count)
{
    var list3 = list1.Intersect(list2);
    return list3.Count == list1.Count();
}

Compare two Lists for differences 发布了类似的问题。

【讨论】:

    【解决方案2】:

    您的函数将传递给它的列表更改为oldFieldValue(通过在其上调用AddRange - 请注意list1 是对同一列表的另一个引用!)。你需要在那里制作一个真实的副本,例如通过.ToList()

    总体而言,从您的方法来看,您似乎正在尝试定义“设置相等性”-即,如果列表包含相同的元素,则将列表视为相等,而忽略重复项和顺序。如果是这样,一个更简单的方法是使用Enumerable.Except()

    if (!oldFieldValue.Except(newFieldValue).Any())
    {
         // no difference
    }
    

    另一方面,如果你只是为了它而使用Distinct(),并且你确实想考虑排序和重复(或者你总是可以保证输入序列是有序的并且没有重复),那么Enumerable.SequenceEqual()是这里的最佳选择。

    【讨论】:

      【解决方案3】:

      我不确定这是否更快,但您可以试试这里的代码: http://blog.slaven.net.au/archives/2008/03/16/comparing-two-arrays-or-ienumerables-in-c/

      它看起来经历了几次修订。并且有几个人在这方面进行了合作,这通常是一个好兆头。

      【讨论】:

      • 我在发布之前确实看到了这个。我考虑过使用它,但我只是认为上面可能是一个快速而肮脏的版本。 :)
      【解决方案4】:

      我认为不同的计数没有进行有意义的比较。想象以下输入:

      oldFieldValue = {"A","HAPPY","HAPPY","WORLD"};
      newFieldValue = {"A","HAPPY","HAPPY","WORLD"};
      

      这些相等吗?

      如果顺序很重要,那么通过两个列表的简单 for 循环将确定相等性。

      如果顺序不重要,则对新数组进行排序(旧数组自然会一直排序),然后在列表中执行 for 循环。

      【讨论】:

      • 那些不相等,因为我在方法中做的第一个检查是查看数组是否相同大小。在我开始比较数组之前,上面会返回 false。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 1970-01-01
      相关资源
      最近更新 更多