.net - two - unir dos listas c#
¿Cómo fusionar varias matrices en una lista usando Linq? (3)
Para cualquier combinación más compleja de IEnumerable
, GetEnumerator
y el yield
son tus amigos y tienen un desempeño IEnumerable
. Solo por diversión , aquí hay un código que muestra que extender Linq con sus propios métodos personalizados no tiene por qué ser aterrador;
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");
}
Tengo la List<Product[]>
y necesito unirlos en un Product[]
.
Puedes usar SelectMany
y luego ToArray
para hacer esto.
var result = source.SelectMany(i => i).ToArray();
También puede utilizar el método de extensión .Concat()
y luego .ToArray()
: x.Concat(y).Concat(z).ToArray();