2012-10-07 58 views
-1

我寫了一些表達相交和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

你確定窗簾後面有一個'foreach'嗎?這隻產生一個'IEnumerable <>',沒有任何東西被迭代。 –

+0

我不是說每個我說這是如何工作,如果我將這寫入foreach然後什麼會... – Nick

回答

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

IntersectConcat方法本身的內部類只是使對輸入參數的驗證和然後分別撥打IntersectIteratorConcatIterator

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; 
     } 
    } 
}