2017-06-24 16 views
0

私はこのような二つのリストました:2つのリストを等しくマージするには?

a1, a2, a3, ..

b1, b2, b3, ..

どのように私はこのような結果を持っているためにそれらを混在させることができます?:

a1, b1, a2, b2, ..


私はこの考えが、私はそれを好きではない:

for (int i = 0; i < List1.Count; i++) 
{ 
    FinalList.Add(List1[i])); 

    if (i < List2.Count) 
     FinalList.Add(List2[i])); 
} 

if (List1.Count < List2.Count) 
{ 
    for (int i = List1.Count; i < List2.Count; i++) 
    { 
     FinalList.Add(List2[i]); 
    } 
} 

答えて

2

あなたはzip 2つの配列の一部を照合して、最も長いシーケンスのconcat残りすることができます:あなたが何かをしたい場合は

var FinalList = List1.Zip(List2, (a,b) => new [] { a, b }) 
    .SelectMany(x => x) 
    .Concat(List1.Count < List2.Count ? List2.Skip(List1.Count) : List1.Skip(List2.Count)) 
    .ToList(); 

より効果的に、そしてあなたがあなた自身の拡張メソッドを書くことができます

public static IEnumerable<T> Merge<T>(this IEnumerable<T> source1, IEnumerable<T> source2) 
{ 
    // null-check here 
    using(var enumerator1 = source1.GetEnumerator()) 
    using(var enumerator2 = source2.GetEnumerator()) 
    { 
     bool hasItem1, hasItem2; 

     do 
     { 
      if (hasItem1 = enumerator1.MoveNext()) yield return enumerator1.Current; 
      if (hasItem2 = enumerator2.MoveNext()) yield return enumerator2.Current; 
     } 
     while (hasItem1 || hasItem2); 
    } 
} 

用途:

var finalList = List1.Merge(List2).ToList(); 
+0

これは '.SelectMany()'でコンパイルされません。 – Enigmativity

+0

@Enigmativity申し訳ありませんが、あなたは正しいです。セレクタを逃した。今更新されました –

+0

あなたは列挙子 –

1

は、これが私の作品:

var List1 = new [] { "a1", "a2", "a3" }; 
var List2 = new [] { "b1", "b2", "b3" }; 

var mix = 
    List1 
     .Zip(List2, (l1, l2) => new [] { l1, l2 }) 
     .SelectMany(x => x); 

それは与える:

 
a1 
b1 
a2 
b2 
a3 
b3 
関連する問題