Linq查询比较2列表<string>的不同匹配</string>

时间:2015-02-05 22:29:45

标签: c# linq lambda

我是Linq的新手并且到处搜索过这个但是如果已经被问到的话,找不到答案。我正在寻找一个Linq查询(理想情况下使用lambda /方法语法)来比较2个列表:

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"

我理想情况下会返回一个值为0-4的int,所以如果上面的所有匹配都成功那么它将返回4,如果没有匹配成功则返回0等等。非常感谢。

2 个答案:

答案 0 :(得分:3)

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

Zip()中定义的函数将返回1或0,具体取决于字符串是否匹配,然后只需Sum()结果。

答案 1 :(得分: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个相同的命名用户数。

<强>更新 这确实不会考虑列表的顺序。这不是原来的问题,我在发布之前错过了评论。如果没有订单要求,这个答案仍然适用。