2010-04-20 68 views
2

給定兩個不同類型的IEnumberables,迭代兩個列表以執行所有可能組合的操作的最佳實踐(考慮可讀性和可維護性)是什麼?枚舉不同類型的列表的所有組合

我最初的解決方案是使用嵌套的foreach循環,遍歷第一個IEnumerable,然後在該循​​環內迭代第二個IEnumerable,並將外部和當前循環的值傳遞給目標方法。例如:

enum ParamOne 
{ 
    First, 
    Second, 
    Etc 
} 

List<int> paramTwo = new List<int>() { 1, 2, 3 }; 

void LoopExample() 
{ 
    foreach (ParamOne alpha in Enum.GetValues(typeof(ParamOne))) 
    { 
     foreach (int beta in paramTwo) 
     { 
      DoSomething(alpha, beta); 
     } 
    } 
} 

我試圖用LINQ重構它,但結束了沒有明顯的優勢,似乎不那麼直觀的東西。這裏的搜索顯示了很多關於嵌套foreach的問題以迭代子屬性,但我找不到關於遍歷兩個不同列表的任何內容。

回答

1

我沒有看到你的解決方案有什麼特別不對。話雖這麼說,最簡單的LINQ程序似乎是:

foreach(var entry in enumerable1.SelectMany(
      e => enumerable2.Select(e2 => new { First = e, Second = e2 }))) 
{ 
    DoSomething(entry.First, entry.Second); 
} 

鑑於這是一個有點... ...鈍我會建議用兩個foreach操作堅持。這比C#編譯器爲了使表達式正常工作而要經歷的所有惡意代碼都要便宜(因爲我們正在處理閉包和匿名類型)。

+0

這證實了我的結論 - 我提出的LINQ過程基本上和你的一樣,我同意它看起來比嵌套'foreach'循環更加鈍。 – jball 2010-04-20 22:47:55

+0

另一方面,如果你需要過濾掉一些東西,並可以得到LINQ,它可能是一個勝利。 – BCS 2010-05-18 14:47:42

+0

@BCS:很明顯,我不能與這種說法爭辯,但我認爲最好與問題中提出的方案一致。否則,我們可以想出適合各種解決方案的假設情況是沒有限制的。換句話說,我寧願拿出一個解決方案來適應這種情況,而不是一個適合解決方案的場景;) – 2010-05-18 14:58:36

1

只要組合中沒有重疊,我就沒有看到在兩組笛卡爾乘積上計算函數的計算效率更高的方法。但是,如果兩個列表中的任何一個具有重複的元素,或者DoSomething的參數順序無關緊要,並且列表中存在重疊,則會產生冗餘調用DoSomething。您可以通過記住DoSomething節省計算時間。