2015-02-05 166 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