2011-08-18 168 views
9

我有兩個對象列表。列表A和列表B.我需要創建列表C,它將列表A和列表B組合成對。例如:如何從C#中的兩個列表創建一個對象對的列表?

List A 
object a1 
object a2 
object a3 

List B 
object b1 
object b2 
object b3 

List C (creates pairs) 
object c1 (object a1, object b1) 
object c2 (object a2, object b2) 
object c3 (object a3, object b3) 
+0

看到此http://stackoverflow.com/questions/166089/what-is- c-analog-of-c-stdpair –

回答

4

這將做到這一點:

public static IEnumerable<Tuple<T, U>> CombineWith<T, U>(this IEnumerable<T> first, IEnumerable<U> second) 
{ 
    using (var firstEnumerator = first.GetEnumerator()) 
    using (var secondEnumerator = second.GetEnumerator()) 
    { 
     bool hasFirst = true; 
     bool hasSecond = true; 

     while (
      // Only call MoveNext if it didn't fail last time. 
      (hasFirst && (hasFirst = firstEnumerator.MoveNext())) 
      | // WARNING: Do NOT change to ||. 
      (hasSecond && (hasSecond = secondEnumerator.MoveNext())) 
      ) 
     { 
      yield return Tuple.Create(
        hasFirst ? firstEnumerator.Current : default(T), 
        hasSecond ? secondEnumerator.Current : default(U) 
       ); 
     } 
    } 
} 

編輯:我喜歡大大答案Paul's

+1

我會使用Paul的解決方案,如果我能夠使用4.0框架,但這對3.5工作,所以謝謝! – Earl

+0

@Earl這是如何工作在3.5? 'Tuple' [僅適用於4.0](http://msdn.microsoft.com/es-es/library/system.tuple%28v=vs.100%29.aspx)。 –

26

您可以在System.Linq中使用Enumerable.Zip()方法。

IEnumerable<Tuple<A, B>> pairs = listA.Zip(listB, (a, b) => Tuple.Create(a, b)); 

實施例使用此所得的可枚舉:

foreach (Tuple<A, B> pair in pairs) 
{ 
    A a = pair.Item1; 
    B b = pair.Item2; 
} 

恥有沒有能夠自動在.NET中tupleation過載。這樣的擴展應該是這樣的:

public static IEnumerable<Tuple<TFirst, TSecond>> Zip<TFirst, TSecond>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second) 
{ 
    return first.Zip(second, Tuple.Create); 
} 

這意味着,你可以編寫代碼,看起來像:

IEnumerable<Tuple<A, B>> pairs = listA.Zip(listB); 

注:另一種選擇是創建匿名類型,而不是Tuple但不足之處到這種方法是,由於類型沒有名稱,您將無法(有用地)將創建的IEnumerable從其創建的方法中傳遞出去。

+0

參考此msdn鏈接獲取更多詳細信息:http://msdn.microsoft.com/en-us/library/dd267698.aspx – Tarang

+1

比我的解決方案好得多:)。 –

+0

謝謝,很棒的建議 - 但是,這隻出現在Framework 4.0中。不幸的是我在這個項目上只限於3.5。 – Earl

1

當你說「對」時,你的意思是鍵/值對嗎?

如果是的話,你想用Dictionary<object, object>

3

像這樣:

var listA = new object[] { "1", "2", "3" }; 
var listB = new object[] { "a", "b", "c" }; 
var listC = Enumerable.Zip(listA,listB, (x,y)=>new {x,y}); 

foreach (var item in listC) 
{ 
    Console.WriteLine("{0},{1}", item.x,item.y); 
} 

輸出: 1, 2,B 3,C

相關問題