LINQ échange les colonnes en rangées
Est là une fantaisie expression LINQ qui pourrait me permettre de faire ce qui suit dans une beaucoup plus simple de la mode. J'ai un List<List<double>>
en supposant que la Liste sont des colonnes dans une matrice 2d, je veux échanger la liste des colonnes dans une liste de lignes. J'ai la suite de la solution la plus évidente:
int columns = 5;
var values; //assume initialised as List<List<double>>()
var listOfRows = new List<List<double>>();
for (int i = 0; i < columns ; i++)
{
List<double> newRow = new List<double>();
foreach (List<double> value in values)
{
newRow.Add(value[i]);
}
listOfRows.Add(newRow);
}
source d'informationauteur Seth
Vous devez vous connecter pour publier un commentaire.
Vous pourriez LINQify la boucle interne assez facilement:
vector.AddRange(values.Select(value => value[i]));
Si oui ou non cela améliore la lisibilité est laissé entièrement à vous!
Voici une expression Linq qui permettrait de faire ce que vous voulez - les regardant, je serais personnellement coller avec le imbriqués les boucles foreach si - beaucoup plus facile à lire:
Cet exemple ne fonctionne que sur une matrice à une colonne fixe le comte. En gros, c'est l'aplatissement de la matrice dans une liste, puis de la création de la liste des lignes en les regroupant par l'index de l'élément dans la liste modulo le nombre de colonnes.
Edit:
Une approche différente, beaucoup plus proche d'une boucle imbriquée et probablement des performances similaires, en plus de la surcharge.
En bref, nous énumérer la colonne d'index à partir d'une gamme et de l'utiliser pour recueillir le n-ième élément de chaque liste.
Veuillez noter que vous aurez besoin de vérifier que chaque liste a le même nombre de colonnes.
Je suis en combinant certaines des réponses ci-dessus, qui ont parfois des colonnes et lignes de la forme inversée de l'original de la réponse ou de la convention, je suis habitué : ligne se réfère à la première de l'index et de la colonne à l'intérieur de la ( seconde) de l'indice. par exemple, les valeurs[ligne][colonne]
En fait le mot de ligne et de colonne, c'est notre convention de la réflexion sur les données en lignes et en colonnes , et ajoute parfois plus de confusion que de les résoudre.
En réalité, nous sommes juste en remplaçant l'intérieur de l'index pour l'extérieur de l'index. (ou de retournement de l'index). Donc, on pourrait aussi définir simplement la suite de la méthode d'extension. . De nouveau, j'ai emprunté de solutions ci-dessus, il suffit de le mettre dans quelque chose que je trouve lisible et assez compact.
Vérifie que les listes internes sont de taille égale sont nécessaires.
Voici un qui fonctionne pour les rectangulaires (non en lambeaux) des matrices. Le code C# fonctionne ici en copier-coller et en LinqPadgratuit, interactif de programmation C# outil.
Je définir un postfix opérateur (c'est une méthode d'extension) "Transposer." L'utilisation de l'opérateur comme suit:
résultant en quelque chose comme ceci:
L'essentiel de la mise en œuvre de cet opérateur est la suivante
Ici, c'est la pleine mise en œuvre, avec quelques lignes en commentaire que vous pouvez décommenter pour surveiller l'utilisation de la fonction travaux.