2016-12-27 70 views
0

假設我有兩個字符串列表。尋找一個優雅的方式來比較兩個列表,並顯示任何一方的差異

List 1 
- Item Abc 
- Item Xyz 
- Item BlahBlah 

List 2 
- Item Abc 
- Item Xyz 
- Item YadiYada 

我要顯示匹配的表和失蹤的比賽,這樣的事情:

List 1   | List 2 
---------------------------------- 
Item Abc  | Item Abc 
Item Xyz  | Item Xyz 
Item BlahBlah | 
       | Item YadiYada 

我想這可能與優雅LINQ做,但我不太確定如何解決它。我會很感激這方面的一些方向。

+1

提供迄今已嘗試過的[mcve],以便在需要時提供幫助。 – Nkosi

+1

集合論呢? 'union'他們然後'.except()'通過他們的'intersect'?而'intersect'會給你匹配,這種方法會給你所有的不匹配。 - ((列表A)U(列表B)) - ((列表A)∩(列表B))' –

+0

@BagusTesa,我知道你要去哪裏,但這隻給我那些沒有不包含在另一個列表中,這只是答案的一部分。我還需要那些僅在List1中的項目和僅在List2中的項目。這有助於讓我走上正軌! – Jiveman

回答

3

嘗試這種情況:

var leftList = new List<string>() { "1", "2", "3" }; 
var rightList = new List<string>() { "2", "3", "4" }; 

var left = leftList.Except(rightList).Select(e => new { L = e, R = string.Empty }); 
var right = rightList.Except(leftList).Select(e => new { L = string.Empty, R = e }); 
var intersection = leftList.Intersect(rightList).Select(e => new {L = e, R = e}); 

var result = intersection.Union(left).Union(right).ToList(); 
+0

啊,我明白了。具有很大的意義。我會盡量使之適應我的情況。 – Jiveman

0

又一個解決方案:

var list1 = new List<string> { "Abc", "Xyz", "BlahBlah" }; 
var list2 = new List<string> { "Abc", "Xyz", "YadiYada" }; 

var r1 = from l1 in list1 
     join l2 in list2 on l1 equals l2 into t 
     from l2 in t.DefaultIfEmpty() 
     select new { l1, l2 }; 

var r2 = from l2 in list2 
     join l1 in list1 on l2 equals l1 into t 
     from l1 in t.DefaultIfEmpty() 
     select new { l1, l2 }; 

var result = r1.Union(r2); 

Left Outer Join

這是使用方法的語法的替代:

var list1 = new List<string> { "Abc", "Xyz", "BlahBlah" }; 
var list2 = new List<string> { "Abc", "Xyz", "YadiYada" }; 

var r1 = list1 
    .GroupJoin(
     list2, 
     l1 => l1, 
     l2 => l2, 
     (l1, l2) => new { l1 = l1, l2 = l2.FirstOrDefault() }); 

var r2 = list2 
    .GroupJoin(
     list1, 
     l2 => l2, 
     l1 => l1, 
     (l2, l1) => new { l1 = l1.FirstOrDefault(), l2 = l2 }); 

var result = r1.Union(r2); 

LINQ Query Syntax versus Method Syntax

一般來說,我們推薦查詢語法,因爲它通常更簡單 和更具可讀性;然而, 方法語法與查詢語法之間沒有語義上的區別。另外,一些查詢,如 那些檢索與指定的 條件相匹配的元素數或者檢索源序列中具有最大值的元素的查詢只能表示爲方法調用。

+0

你會如何使用LINQ擴展語法(使用lambda表達式)來編寫此代碼? – Jiveman

相關問題