Linq 查询比较 2 List<string> 以获得不同的匹配项
Linq query to compare 2 List<string> for distinct matches
我是 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"
理想情况下,我希望它是 return 一个值为 0-4 的 int,所以如果上面的所有匹配都成功,那么它将 return 4,如果没有匹配成功则returns 0 等。非常感谢。
List1.Zip(List2, (item1, item2) => item1 == item2 ? 1 : 0).Sum();
Zip() 中定义的函数将 return 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 个相同的命名用户。
更新
这确实不会考虑列表的顺序。这不在原始问题中,我在发布之前错过了评论。没有订单要求,这个答案仍然适用。
我是 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"
理想情况下,我希望它是 return 一个值为 0-4 的 int,所以如果上面的所有匹配都成功,那么它将 return 4,如果没有匹配成功则returns 0 等。非常感谢。
List1.Zip(List2, (item1, item2) => item1 == item2 ? 1 : 0).Sum();
Zip() 中定义的函数将 return 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 个相同的命名用户。
更新 这确实不会考虑列表的顺序。这不在原始问题中,我在发布之前错过了评论。没有订单要求,这个答案仍然适用。