2011-09-18 16 views
0

以特殊的方式聚集樹列表我有串樹列表(列表的數量可能有所不同)淨 - 使用LINQ

列表1
一個

列表2
NUM1
NUM2
NUM3

項目list3
TT

因此,我想這個字符串列表:
一個NUM1 TT
一個NUM2 TT
一個NUM3 TT
乙NUM1 TT
乙NUM2 TT
B num3 TT

因此,您可以看到我想要從一個列表中加入每個字符串與其他字符串中的每個字符串。

如何在使用Linq的.Net中執行此操作?有沒有辦法?

+0

你需要這對固定數量的清單工作,或在數在運行時動態選擇? – Jon

+0

動態..清單是可變的(因爲他們數,所以每個清單可以有不同的約項目) –

回答

3

這裏有一個解決方案:

IEnumerable<string> MultiConcat(params IEnumerable<string>[] lists) 
{ 
    if (lists == null) { 
     return null; 
    } 

    if (lists.Length == 0) { 
     return Enumerable.Empty<string>(); 
    } 

    return lists.Aggregate(new[] { string.Empty } as IEnumerable<string>, 
        (acc, list) => acc.SelectMany(s1 => list.Select(s2 => s1 + s2))); 
} 

如何使用它:

var list1 = new List<string> { "A", "B" }; 
var list2 = new List<string> { "1", "2", "3" }; 
var list3 = new List<string> { "FOO", "BAR" }; 

foreach (var s in MultiConcat(list1, list2, list3)) { 
    Console.Out.WriteLine(s); 
} 

See it in action

它是如何工作

基本上它只是一個呼叫Enumerable.Aggregate。這個想法是,我們有一個可枚舉的字符串集合(「當前」)和另一個(「傳入」)我們想要加入它。我們做

current.SelectMany(s1 => incoming.Select(s2 => s1 + s2)) 

這是直接等同於

from var s1 in current 
from var s2 in incoming 
select s1 + s2 

換句話說,它產生兩種可枚舉的內連接。

Aggregate的美妙之處在於它允許我們多次執行此操作,一次處理多個「傳入」集合。

+0

工程就像一個魅力.. tnx –

+1

@Ai_boy:HTH。 'Enumerable.Aggregate'是超強大的 - 記住它將來。 – Jon

0
from l1 in list1 
from l2 in list2 
from l3 in list3 
select l1 + " " + l2 + " " + l3 
+0

「(列表數量可能有所不同)」 - 我無法使用像這樣的硬編碼代碼。 –

1

你可以聲明像一個延伸:

static class Extensions 
{ 
    public static IEnumerable<T> Merge<T, F, S>(this IEnumerable<F> source, IEnumerable<S> second, Func<F, S, T> func) 
    { 
     foreach (var item in source) 
     { 
      foreach (var item2 in second) 
      { 
       yield return func(item, item2); 
      } 
     } 
    } 
} 

,然後用它喜歡:

var res = list1 
       .Merge(list2, (f,s) => f + " " + s) 
       .Merge(list3, (f,s) => f + " " + s);