我想比較通用列表,並過濾不匹配的值。我目前正在使用一個foreach循環,但我想知道是否有辦法使用lambda表達式來解決這個問題?在下面的例子中,我想要一個只包含「4」的結果列表。比較通用列表和過濾器不匹配值
List<string> foo = new List<string>() { "1", "2", "3" };
List<string> bar = new List<string>() { "1", "2", "3", "4" };
我想比較通用列表,並過濾不匹配的值。我目前正在使用一個foreach循環,但我想知道是否有辦法使用lambda表達式來解決這個問題?在下面的例子中,我想要一個只包含「4」的結果列表。比較通用列表和過濾器不匹配值
List<string> foo = new List<string>() { "1", "2", "3" };
List<string> bar = new List<string>() { "1", "2", "3", "4" };
使用的LINQ Except<>
延伸:
var result = bar.Except(foo);
在內部這增加了所有的foo
成Set<>
(內部.NET類型類似於一個HashSet<T>
),然後產生所有從bar
其是成功的那些項目添加。
注意 - 如果你需要區分大小寫的比較,你可以通過一個特定的StringComparer
:
var result = bar.Except(foo, StringComparer.OrdinalIgnoreCase);
結果是IEnumerable<string>
,並與許多其他LINQ的擴展方法,不啓動做什麼直到你用foreach
迭代或者通過致電ToArray
或ToList
或其他方法「實現」結果。
謝謝你,很好,很簡單:) – Johan
如果你不想使用Except
兩次,可以考慮這樣的事情:
var listOld = new SortedSet<string> { "1", "2", "3", "4", };
var listNew = new SortedSet<string> { "1", "1½", "2", "4", "5", };
然後簡單地說
listNew.SymmetricExceptWith(listOld);
將修改listNew
所以它現在包含的「差異化元素」兩個原始列表。
謝謝,很好添加 – Johan
你能舉一些例子嗎?如果兩個序列中存在相同的數字,但順序不同?或者我們可以排除這一點嗎?可以重複嗎?你是否希望所有的數字都是這兩個列表中的一個的成員? –
@JeppeStigNielsen我有一個包含我的「舊」值的列表。然後我得到另一個清單,通常與舊的清單相匹配。但是它可能在新名單中更少或更多的價值。但我想'Except'方法就足夠了?如果您想讓我闡述我的問題,請讓我知道。 – Johan
也許你可以在'SortedSet'這樣的集合上使用'SymmetricExceptWith'? 「Except」建議只能以「單向」方式運作,所以如果另一個建議較大,則不會報告。 –