一种比较数组的方法

时间:2009-09-15 17:05:36

标签: c# linq arrays

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

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。

4 个答案:

答案 0 :(得分:6)

我认为您的代码存在严重的性能问题。然而,令我困扰的是你将list1修改为进行比较的副作用。

以下工作会更好吗?

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

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

答案 1 :(得分:1)

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

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

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

另一方面,如果您只是为了它而使用Distinct(),并且您确实想要考虑排序和重复(或者您可以始终保证输入序列是有序的并且具有没有欺骗),那么Enumerable.SequenceEqual()是最好的选择。

答案 2 :(得分:0)

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

看起来它经历了几次修改。有几个人合作过,这通常是一个好兆头。

答案 3 :(得分:0)

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

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

这些是否相等?

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

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