Как объединить несколько массивов в список с помощью Linq? - PullRequest
25 голосов
/ 24 июля 2009

У меня есть List<Product[]>, и мне нужно объединить их в один Product[].

Ответы [ 3 ]

59 голосов
/ 24 июля 2009

Вы можете использовать SelectMany, а затем ToArray, чтобы сделать это.

var result = source.SelectMany(i => i).ToArray();
5 голосов
/ 24 июля 2009

Вы также можете использовать .Concat() метод расширения, а затем .ToArray(): x.Concat(y).Concat(z).ToArray();

0 голосов
/ 03 марта 2017

Для любых более сложных объединений IEnumerable, GetEnumerator и yield являются вашими друзьями и превосходны. Просто для удовольствия , вот некоторый код, демонстрирующий расширение 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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...