2009-07-24 14 views

Antwort

44

Sie können dazu und dann ToArray verwenden.

var result = source.SelectMany(i => i).ToArray(); 
4

Sie verwenden .Concat() Erweiterungsmethode als auch, und dann .ToArray(): x.Concat(y).Concat(z).ToArray();

0

Für komplexere verbindet IEnumerable, GetEnumerator und yield deine Freunde sind und sind super performant. Nur zum Spaß, hier ist ein Code, der das Erweitern von Linq mit Ihren eigenen benutzerdefinierten Methoden zeigt, muss nicht gruselig sein;

public static class MyLinqExtensions 
{ 
    public static IEnumerable<int> RoundRobin(this IEnumerable<int> a, IEnumerable<int> b) 
    { 
     var ae = a.GetEnumerator(); 
     var be = b.GetEnumerator(); 

     bool aHasNumber = ae.MoveNext(); 
     bool bHasNumber = be.MoveNext(); 

     while (aHasNumber || bHasNumber) 
     { 
      if (aHasNumber) 
      { 
       yield return ae.Current; 
       aHasNumber = ae.MoveNext(); 
      } 

      if (bHasNumber) 
      { 
       yield return be.Current; 
       bHasNumber = be.MoveNext(); 
      } 
     } 
    } 
} 

void Main() 
{ 

    var arr1 = new[] { 1, 2, 3, 4 }; 
    var arr2 = new[] { 4, 5, 6 }; 
    var arr3 = new[] { 7, 8, 9}; 
    var arr4 = new int[] { }; 

    // arrays the same size 
    Assert.AreEqual(new[] { 4, 7, 5, 8, 6, 9 }, arr2.RoundRobin(arr3).ToArray()); 

    // array 1 bigger than array 2 
    Assert.AreEqual(new[] { 1, 4, 2, 5, 3, 6, 4 }, arr1.RoundRobin(arr2).ToArray()); 

    // array 1 smaller than 2 
    Assert.AreEqual(new[] { 4, 1, 5, 2, 6, 3, 4 }, arr2.RoundRobin(arr1).ToArray()); 

    // 2 empty, 1 not 
    Assert.AreEqual(new[] { 4, 5, 6 }, arr2.RoundRobin(new int[] { }).ToArray()); 

    // 1 empty, 2 not 
    Assert.AreEqual(new[] { 1, 2, 3, 4 }, arr1.RoundRobin(new int[] { }).ToArray()); 

    // both empty 
    Assert.AreEqual(new int[] { }, arr4.RoundRobin(arr4).ToArray()); 

    // prove it's Linq 
    Assert.AreEqual(new[] { 1, 4, 2}, arr1.RoundRobin(arr2).Take(3).ToArray()); 

    Console.WriteLine("pass"); 
} 
Verwandte Themen