2015-02-05 162 views
0

我是Linq的新手,並且已經遍尋全球,但如果已經詢問,找不到答案。我尋找LINQ查詢(理想地使用的λ/方法的語法)來比較2所列出:Linq查詢比較2列表<string>不同的匹配

IList<string> List1 = new List<string> { usr.User1, usr.User2, usr.User3, usr.User4 }; 

IList<string> List2 = new List<string>{ "Tim", "Bob", "Brian", "Paul" }; 

基本上我想在那裏只有4點可能的匹配,因此,如果:

usr.User1 == "Tim", 
usr.User2 == "Bob", 
usr.User3 == "Brian", 
usr.User4 == "Paul" 

我理想情況下它會返回一個int值爲0-4的整數,所以如果上述所有匹配都成功了,那麼它將返回4,如果沒有匹配成功,則返回0等。非常感謝。

+0

不要以爲你需要複雜的東西,除非你想學習linq。一個'for'語句可以用2行代碼來實現,而且會更具可讀性和令人難以置信。 – 2015-02-05 22:34:33

+0

位置是否重要?例如如果'User1'是Bob並且'User2'是Tim,是預期結果4還是2? – 2015-02-05 22:38:30

+0

嗨,只有user1可以是Tim,user2 Bob等 – 2015-02-05 22:42:38

回答

3
List1.Zip(List2, (item1, item2) => item1 == item2 ? 1 : 0).Sum(); 

在Zip()中定義的函數將返回1或0,這取決於字符串是否匹配,然後您只需Sum()結果。

+0

這不好嗎? List1.Sum(x => List2.Contains(x)?1:0); – kanchirk 2015-02-05 22:39:27

+0

@kanchirk它只檢查名稱是否存在於列表中。 Zip()方法將檢查List1中的第一項是否爲「Tim」,List2中的第二項是否爲「Bob」等。即使List1中的每個名稱都是「Brian」,您的解決方案也會返回4。 – itsme86 2015-02-05 22:41:37

0

另一種解決方案是使用相交。像這樣:

private class User 
    { 
     public string UserName { get; set; } 
    } 

    [TestMethod] 
    public void TwoListsWithSameUsersReturnCorrectCountOfEquality() 
    { 
     var user1 = new User { UserName = "Tim" }; 
     var user2 = new User { UserName = "Bob" }; 
     var user3 = new User { UserName = "Brian" }; 
     var user4 = new User { UserName = "Paul" }; 

     IList<string> List1 = new List<string> 
       { user1.UserName, user2.UserName, user3.UserName, user4.UserName }; 

     IList<string> List2 = new List<string> { "Tim", "Bob", "Brian", "Paul" }; 

     var sameUser = List1.Distinct().Intersect(List2.Distinct()); 

     Assert.AreEqual(4, sameUser.Count()); 
    } 

請注意,比較區分大小寫。因此,tim會導致4位同名用戶的計數。

更新 這實際上不會考慮列表的順序。這不是原來的問題,我在發佈之前錯過了評論。沒有訂單要求,這個答案仍然適用。

+0

這將忽略元素的順序 – 2015-02-05 22:46:09

+0

在問題中的哪個位置是一個要求? – 2015-02-05 22:47:23

+0

我要求在評論中作出澄清。 – 2015-02-05 22:47:41