2009-07-24 26 views

Respuesta

44

Puede usar SelectMany y luego ToArray para hacerlo.

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

Puede utilizar .Concat() método de extensión, así, y luego .ToArray(): x.Concat(y).Concat(z).ToArray();

0

Para cualquier más complejo se une a IEnumerable, y GetEnumeratoryield son tus amigos y son super performant. Solo por diversión, aquí hay un código que muestra que la extensión de Linq con sus propios métodos personalizados no tiene que dar miedo;

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"); 
} 
Cuestiones relacionadas