我想知道我在下面比较一个字符串数组(或任何简单类型)的方法是否会产生任何性能影响。
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 :(得分: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循环。