相交LINQ查询

Kla*_*Nji 48 .net c# linq

如果我有一个IEnumerable,其中ClassA公开了类型为long的ID属性.是否可以使用Linq查询获取具有属于第二个IEnumerable的ID的ClassA的所有实例?

换句话说,这可以做到吗?

IEnumerable<ClassA> = original.Intersect(idsToFind....)?
Run Code Online (Sandbox Code Playgroud)

原来是IEnumerable<ClassA>和idsToFind的地方IEnumerable<long>.

SLa*_*aks 56

是.

正如其他人已经回答的那样,你可以使用Where,但对于大型套装来说效率极低.

如果需要考虑性能,可以致电Join:

var results = original.Join(idsToFind, o => o.Id, id => id, (o, id) => o);
Run Code Online (Sandbox Code Playgroud)

如果idsToFind可以包含重复项,则需要调用Distinct()ID或结果或替换JoinGroupJoin (GroupJoin的参数将相同).


Dra*_*lut 15

我会发一个答案Intersect.

如果要与IEnumerables相同类型的2相交,这非常有用.

首先我们需要一个EqualityComparer:

    public class KeyEqualityComparer<T> : IEqualityComparer<T>
    {
        private readonly Func<T, object> keyExtractor;

        public KeyEqualityComparer(Func<T, object> keyExtractor)
        {
            this.keyExtractor = keyExtractor;
        }

        public bool Equals(T x, T y)
        {
            return this.keyExtractor(x).Equals(this.keyExtractor(y));
        }

        public int GetHashCode(T obj)
        {
            return this.keyExtractor(obj).GetHashCode();
        }
    }
Run Code Online (Sandbox Code Playgroud)

其次,我们应用KeyEqualityComparerIntersect功能:

var list3= list1.Intersect(list2, new KeyEqualityComparer<ClassToCompare>(s => s.Id));
Run Code Online (Sandbox Code Playgroud)


Dav*_*fer 9

您可以这样做,但在当前表单中,您需要使用Where扩展方法.

var results = original.Where(x => yourEnumerable.Contains(x.ID));
Run Code Online (Sandbox Code Playgroud)

Intersect另一方面,将找到两者中IEnumerable的元素.如果您只想查找ID列表,可以执行以下操作Intersect

var ids = original.Select(x => x.ID).Intersect(yourEnumerable);
Run Code Online (Sandbox Code Playgroud)


bru*_*nde 5

一个简单的方法是:

IEnumerable<ClassA> result = original.Where(a => idsToFind.contains(a.ID));
Run Code Online (Sandbox Code Playgroud)