2009-09-15 112 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