2012-08-15 33 views
1

我有兩個字符串的列表,這兩個列表都是〜300,000行。列表1有比列表2更多的行。我想要做的是找到列表1中的字符串,但不是列表2中的列表。兩個列表的區別C#

考慮到我要比較的字符串有多少個,是Except()還是夠用的,或者有沒有更好的(更快)?

+7

這只是一個問題,如果你注意到性能下降。性能問題只能由您來解答,因爲只有您知道您的應用程序「太慢」。考慮最終用戶,目標平臺等。 – 2012-08-15 02:41:10

+1

如果重複行不是問題,則可以使用HashSet和Contains方法。 http://msdn.microsoft.com/en-us/library/bb356440.aspx – 2012-08-15 02:47:45

+1

從列表移動到哈希表,然後只使用包含似乎是一個很好的方式來快速實現非常接近的最佳性能 – 2012-08-15 02:51:33

回答

5

在內部,枚舉Except擴展方法使用Set<T>執行計算。這將會和其他方法一樣快。

list1.Except(list2)

它會給你最好的表現和最簡單的代碼。

+0

正如喬納森指出的那樣,它*可能有意義,爲一個(或兩個)列表使用HashSet,因爲「Except」可以避免創建立即[Hash]集合。當然,這意味着原始數據排序並不重要,不允許重複,並且差異被執行的次數足以影響它。 – 2012-08-15 05:22:28

+0

@Enigmativity是的,你是對的。 – 2012-08-15 11:07:09

1

我的建議:

HashSet<String> hash1 = new HashSet<String>(new string[] { "a", "b", "c", "d" }); 
    HashSet<String> hash2 = new HashSet<String>(new string[] { "a", "b" }); 
    List<String> result = hash1.Except(hash2).ToList(); 
+0

或包含循環。 – 2012-08-15 03:28:25