我在Intersect和Concat两个列表中写了一些表达式TestListA& TestListB如下:
var c= TestListA.Intersect(TestListB)
.Concat(ListA.Where(a =>
ListB.Any(b => b.EndsWith("999")
&& b.StartsWith(a.Substring(0, a.Length - 3)))));
我想知道循环和其他条件在幕后的情况如何,如果我在foreach的帮助下编写所有这些,那么性能会降低吗?
答案 0 :(得分:2)
您可以访问大多数.net框架源。
您在此处使用的方法如下:
static IEnumerable<TSource> IntersectIterator<TSource>(IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)
{
Set<TSource> set = new Set<TSource>(comparer);
foreach (TSource element in second) set.Add(element);
foreach (TSource element in first)
if (set.Remove(element)) yield return element;
}
static IEnumerable<TSource> ConcatIterator<TSource>(IEnumerable<TSource> first, IEnumerable<TSource> second) {
foreach (TSource element in first) yield return element;
foreach (TSource element in second) yield return element;
}
public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
if (source == null) throw Error.ArgumentNull("source");
if (predicate == null) throw Error.ArgumentNull("predicate");
foreach (TSource element in source) {
if (predicate(element)) return true;
}
return false;
}
Set
是一个内部类,其行为类似HashSet
Intersect
和Concat
方法本身只会对输入参数进行一些验证,然后分别调用IntersectIterator
和ConcatIterator
。
Where
方法也会进行验证,然后构建WhereEnumerableIterator<T>
类的实例。迭代它时,此类的行为类似于以下代码:
public IEnumerable<T> IterateWhere(IEnumerable<T> source, Funct<T,bool> predicate)
{
foreach (var element in source)
{
if (predicate(element))
{
yield return element;
}
}
}