根据特定的比较器获取两个列表中的对象

时间:2016-12-21 13:24:53

标签: c# .net linq

我有两个listA个对象listBUser,其中包含User个对象的集合。

每个ID对象都有一个属性listA

我希望根据listB属性获取IDlistA.Where(a => listB.Any(b => b.ID == a.ID)); 中存在的用户列表。

到目前为止,这是我的代码:

listB

有更好的方法吗?感觉它可能效率低下,尤其是User很大的时候。

IEquatable对象未实现public static class ExtensionMethods { public static IQueryable<T> SetQueryName<T>(this IQueryable<T> source, [CallerMemberName] String name = null, [CallerFilePath] String sourceFilePath = "", [CallerLineNumber] Int32 sourceLineNumber = 0) { var expr = Expression.NotEqual(Expression.Constant("Query name: " + name), Expression.Constant(null)); var param = Expression.Parameter(typeof(T), "param"); var criteria1 = Expression.Lambda<Func<T, Boolean>>(expr, param); expr = Expression.NotEqual(Expression.Constant($"Source: {sourceFilePath} ({sourceLineNumber})"), Expression.Constant(null)); var criteria2 = Expression.Lambda<Func<T, Boolean>>(expr, param); return source.Where(criteria1).Where(criteria2); } }

3 个答案:

答案 0 :(得分:2)

如果User实现IEquatable<User>,假设如果User相同,则两个ID是相同的,那么您可以使用LINQ Intersect。例如:

listA.Intersect(listB);

如果User未实现IEquatable<User>,您可以使用Intersect调用IEqualityComparer<User>。例如:

listA.Intersect(listB, new UserEqualityComparer());

,其中

UserEqualityComparer : IEquatable<User> {...}

答案 1 :(得分:1)

这应该这样做:

var result = listA.Intersect(listB);

假设您的User类实现了IEquatable<User>

如果不是这种情况,那么您可以执行类似的操作,以便根据ID值与两个列表相交:

var result = listA.Select(s1 => s1.ID).ToList().Intersect(listB.Select(s2 => s2.ID).ToList()).ToList();

这将在两个列表中创建两个新的ID值列表,并获取它们之间的交集。

答案 2 :(得分:1)

另一个选项是Join两个集合的Id属性..

var results = listA.Join(listB, a => a.Id, b=> b.Id, (a, b) => a);