我有两个listA
个对象listB
和User
,其中包含User
个对象的集合。
每个ID
对象都有一个属性listA
。
我希望根据listB
属性获取ID
和listA.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);
}
}
。
答案 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);