Fusionner plusieurs listes en une liste avec LINQ
Est-il un habile moyen de fusionner plusieurs Listes en une seule Liste à l'aide de LINQ to efficace de reproduire cela?
public class RGB
{
public int Red { get; set; }
public int Green { get; set; }
public int Blue { get; set; }
public RGB(int red, int green, int blue) { Red = red; Green = green; Blue = blue; }
}
public void myFunction()
{
List<int> red = new List<int> { 0x00, 0x03, 0x06, 0x08, 0x09 };
List<int> green = new List<int> { 0x00, 0x05, 0x06, 0x07, 0x0a };
List<int> blue = new List<int> { 0x00, 0x02, 0x03, 0x05, 0x09 };
List<RGB> colors = new List<RGB>();
colors.Add(new RGB(red[0], green[0], blue[0]));
colors.Add(new RGB(red[1], green[1], blue[1]));
colors.Add(new RGB(red[2], green[2], blue[2]));
colors.Add(new RGB(red[3], green[3], blue[3]));
colors.Add(new RGB(red[4], green[4], blue[4]));
}
Ou, étant donné que les listes arrivent séparément, son plus efficace de les fusionner de manière séquentielle comme suit.
public class RGB
{
public int Red { get; set; }
public int Green { get; set; }
public int Blue { get; set; }
public RGB(int red, int green, int blue) { Red = red; Green = green; Blue = blue; }
}
public void myFunction()
{
List<int> red = new List<int> { 0x00, 0x03, 0x06, 0x08, 0x09 };
List<RGB> colors = new List<RGB>();
colors.Add(new RGB(red[0], 0, 0));
colors.Add(new RGB(red[1], 0, 0));
colors.Add(new RGB(red[2], 0, 0));
colors.Add(new RGB(red[3], 0, 0));
colors.Add(new RGB(red[4], 0, 0));
List<int> green = new List<int> { 0x00, 0x05, 0x06, 0x07, 0x0a };
colors[0].Green = green[0];
colors[1].Green = green[1];
colors[2].Green = green[2];
colors[3].Green = green[3];
colors[4].Green = green[4];
List<int> blue = new List<int> { 0x00, 0x02, 0x03, 0x05, 0x09 };
colors[0].Blue = blue[0];
colors[1].Blue = blue[1];
colors[2].Blue = blue[2];
colors[3].Blue = blue[3];
colors[4].Blue = blue[4];
}
source d'informationauteur tlum
Vous devez vous connecter pour publier un commentaire.
Vous êtes essentiellement en essayant de remonter la fermeture éclair de trois collections. Si seulement le LINQ
Zip()
pris en charge la compression de plus de deux simultanément. Mais hélas, il ne prend en charge que deux à la fois. Mais nous pouvons le faire fonctionner:Bien sûr, il n'est pas très douloureux à écrire une extension de la méthode à trois (ou plus).
Cela rend les choses beaucoup plus agréable:
Oui - vous pouvez le faire comme ceci:
Vous pouvez utiliser l'ensemble des avec Zip zip un nombre arbitraire de IEnumerables en une seule fois.
Voici comment vous pouvez le faire avec votre exemple:
Généralement, en s'appuyant sur la fermeture à glissière sous-jacent à combiner évite les problèmes avec des variables d'entrée longueurs.
Ici est une version simplifiée qui prend tout nombre de séquences (comme un tableau) de même type et de zips ensemble:
Pros
.Zip()
méthode.Zip
pour ajouter une séquence à chaque foisContre
Utilisation
Jeff Mercado fournit une réponse où trois séquences sont zippés. Ceci peut être généralisé à un nombre de séquences avec la limitation que toutes les séquences donc avoir le même type d'élément.
Ici est généralisée zip opérateur qui s'occupe d'entrée variable longueurs et avec d'erreur de manipulation et d'élimination des agents recenseurs:
Les couleurs peuvent alors être calculée à l'aide de cette généralisé zip opérateur:
Le code peut ne pas être aussi élégant que d'autres solutions, mais généralisée zip opérateur peut être utile dans certaines situations, et le code que j'ai fourni est efficace parce qu'elle seule itération de chaque séquence source une fois.