这完全取决于您想要什么:
// are there any common values between a and b?
public static bool SharesAnyValueWith<T>(this IEnumerable<T> a, IEnumerable<T> b)
{
return a.Intersect(b).Any();
}
对于不重叠的列表,这将遍历 a 和 b 一次。对于重叠的列表,这将遍历 a,然后遍历 b,直到找到第一个重叠元素。
// does a contain all of b? (ignores duplicates)
public static bool ContainsAllFrom<T>(this IEnumerable<T> a, IEnumerable<T> b)
{
return !b.Except(a).Any();
}
这将遍历 a 一次,然后将遍历 b,在 b 中的第一个元素上停止,而不是在 a 中。
// does a contain all of b? (considers duplicates)
public static bool ContainsAllFrom<T>(this IEnumerable<T> a, IEnumerable<T> b)
{
// get the count of each distinct element in a
var counts = a.GroupBy(t => t).ToDictionary(g => g.Key, g => g.Count());
foreach (var t in b) {
int count;
// if t isn't in a or has too few occurrences return false. Otherwise, reduce
// the count by 1
if (!counts.TryGetValue(t, out count) || count == 0) { return false; }
counts[t] = count - 1;
}
return true;
}
类似地,这将遍历 a 一次,然后将遍历 b,在 b 中的第一个元素上停止,而不是在 a 中。