2009-09-15 71 views
1

我在想如果我的方法比较字符串数组(或任何简单的类型)是否有任何性能影响。比较数组的一种方法

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。

+0

您是否知道SequenceEquals扩展?要获得您的功能,您首先必须订购这些清单。 – 2009-09-15 17:17:58

+0

也可以,你可能想检查null。 – 2009-09-15 18:45:16

回答

6

我不认为你的代码有一个重大的性能问题。但是,让我感到困扰的是,您正在修改list1作为比较的副作用。

下面的工作会更好吗?

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

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

+0

不错。我会试试这个。 – johnofcross 2009-09-15 18:07:35

1

您的函数将传递给它的列表变为oldFieldValue(通过调用AddRange - 请注意list1是对同一列表的另一个引用!)。您需要在那里制作一份真实的副本,例如通过.ToList()。总的来说,从你的方法看来,你似乎在试图定义“集合相等” - 即如果列表包含相同的元素,不论重复和顺序如何,都将列表视为相等。如果是这样,一个简单得多的方式来做到这一点是使用Enumerable.Except()

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

在另一方面,如果你只是使用Distinct()那里的缘故吧,和你想采取订货和重复考虑(或者你可以保证输入序列是有序的并且没有愚蠢),那么Enumerable.SequenceEqual()是最好的选择。

+0

+1上的突变呼出。谢谢! – johnofcross 2009-09-15 18:00:16

0

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

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

这些是平等的吗?

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

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

+0

那些不相等,因为我在该方法中执行的第一个检查是查看数组是否具有相同的大小。在我开始比较数组之前,上面会返回false。 – johnofcross 2009-09-15 17:28:51

+0

固定。你的代码中它们仍然不相等吗? – Will 2009-09-15 17:45:11