2012-11-14 58 views
2

我想比較通用列表,並過濾不匹配的值。我目前正在使用一個foreach循環,但我想知道是否有辦法使用lambda表達式來解決這個問題?在下面的例子中,我想要一個只包含「4」的結果列表。比較通用列表和過濾器不匹配值

List<string> foo = new List<string>() { "1", "2", "3" }; 
List<string> bar = new List<string>() { "1", "2", "3", "4" }; 
+0

你能舉一些例子嗎?如果兩個序列中存在相同的數字,但順序不同?或者我們可以排除這一點嗎?可以重複嗎?你是否希望所有的數字都是這兩個列表中的一個的成員? –

+0

@JeppeStigNielsen我有一個包含我的「舊」值的列表。然後我得到另一個清單,通常與舊的清單相匹配。但是它可能在新名單中更少或更多的價值。但我想'Except'方法就足夠了?如果您想讓我闡述我的問題,請讓我知道。 – Johan

+0

也許你可以在'SortedSet '這樣的集合上使用'SymmetricExceptWith'? 「Except」建議只能以「單向」方式運作,所以如果另一個建議較大,則不會報告。 –

回答

4

使用的LINQ Except<>延伸:

var result = bar.Except(foo); 

在內部這增加了所有的fooSet<>(內部.NET類型類似於一個HashSet<T>),然後產生所有從bar其是成功的那些項目添加。

注意 - 如果你需要區分大小寫的比較,你可以通過一個特定的StringComparer

var result = bar.Except(foo, StringComparer.OrdinalIgnoreCase); 

結果是IEnumerable<string>,並與許多其他LINQ的擴展方法,不啓動做什麼直到你用foreach迭代或者通過致電ToArrayToList或其他方法「實現」結果。

+0

謝謝你,很好,很簡單:) – Johan

1

如果你不想使用Except兩次,可以考慮這樣的事情:

var listOld = new SortedSet<string> { "1", "2", "3", "4", }; 
var listNew = new SortedSet<string> { "1", "1½", "2", "4", "5", }; 

然後簡單地說

listNew.SymmetricExceptWith(listOld); 

將修改listNew所以它現在包含的「差異化元素」兩個原始列表。

+0

謝謝,很好添加 – Johan