-1

以下のように、TestListA と TestListB の 2 つのリストを Intersect して Concat する式を書きました。

var c= TestListA.Intersect(TestListB)
                .Concat(ListA.Where(a => 
                    ListB.Any(b => b.EndsWith("999") 
                                && b.StartsWith(a.Substring(0, a.Length - 3)))));

ループやその他の条件が舞台裏でどのように見えるかを知りたいのですが、これらすべてを foreach の助けを借りて記述すると、パフォーマンスが低下しますか?

4

1 に答える 1

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

IntersectandConcatメソッド自体は、入力パラメーターの検証を行ってから、IntersectIteratorand を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;
        }
    }
}
于 2012-10-07T19:04:25.733 に答える