如果我有一個IEnumerable,其中ClassA公開一個類型爲long的ID屬性。 是否有可能使用Linq查詢來獲取屬於第二個IEnumerable的ID的ClassA的所有實例?相交LINQ查詢
換句話說,這可以做到嗎?
IEnumerable<ClassA> = original.Intersect(idsToFind....)?
其中原始是IEnumerable<ClassA>
和idsToFind是IEnumerable<long>
。
如果我有一個IEnumerable,其中ClassA公開一個類型爲long的ID屬性。 是否有可能使用Linq查詢來獲取屬於第二個IEnumerable的ID的ClassA的所有實例?相交LINQ查詢
換句話說,這可以做到嗎?
IEnumerable<ClassA> = original.Intersect(idsToFind....)?
其中原始是IEnumerable<ClassA>
和idsToFind是IEnumerable<long>
。
使用Where方法來篩選結果:
var result = original.Where(o => idsToFind.Contains(o.ID));
一個簡單的方法是:
IEnumerable<ClassA> result = original.Where(a => idsToFind.contains(a.ID));
你可以做到這一點,但在目前的形式,你想使用擴展方法Where
。
var results = original.Where(x => yourEnumerable.Contains(x.ID));
,另一方面Intersect
會發現,在兩種IEnumerable
的元素。如果你正在尋找只是一個ID的列表,你可以做這需要的Intersect
var ids = original.Select(x => x.ID).Intersect(yourEnumerable);
我會用Intersect
發表一個答案。
如果您想要交叉相同類型的2 IEnumerables
,這非常有用。
首先,我們需要一個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();
}
}
其次,我們應用KeyEqualityComparer
到Intersect
功能:
var list3= list1.Intersect(list2, new KeyEqualityComparer<ClassToCompare>(s => s.Id));
這就是我一直在尋找,謝謝。不知何故,這並沒有使我在原來的問題,但idsToFind = IEnumerable。 再次感謝。 –
2010-03-04 18:00:13
任何有關'original'或'idsToFind'大小的'Join'開始比'Where'/'Contains'解決方案更有效的想法嗎?我可以想象,對於小列表(可能20-30項),「Join」的開銷太多了? – Tobias 2012-09-05 09:00:45