2009-07-24 2 views

답변

44

SelectMany을 입력 한 다음 ToArray을 입력하면됩니다.

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

그런 다음 .ToArray().Concat() 확장뿐만 아니라 방법 및 사용할 수있는 더 복잡한 들어 x.Concat(y).Concat(z).ToArray();

0

IEnumerable, GetEnumeratoryield이 당신의 친구와 슈퍼 확대됨에 있습니다 조인. 그냥 재미에 대한, 여기에 몇 가지 코드가 자신의 사용자 지정 방법을 사용하여 확장 Linq 보여주는 무서운 필요가 없습니다;

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"); 
} 
관련 문제