La sélection d'éléments de la matrice selon les indices spécifiés dans un autre tableau c#
Supposons que nous avons un tableau avec des données:
double[] x = new double[N] {x_1, ..., x_N};
Et tableau de taille N
contenant les étiquettes correspondant aux éléments de x
:
int[] ind = new int[N] {i_1, ..., i_N};
Quel est le moyen le plus rapide pour sélectionner tous les éléments de x
qui ont certaines étiquette I
selon ind
?
Par exemple,
x = {3, 2, 6, 2, 5}
ind = {1, 2, 1, 1, 2}
I = ind[0] = 1
Résultat:
y = {3, 6, 2}
Clairement, il peut être facilement (mais pas de manière efficace et propre) fait avec des boucles, mais je pense qu'il devrait être la façon de le faire à l'aide .Where
et les lambdas..Merci
EDIT:
La réponse fournie par MarcinJuraszek est tout à fait correct, merci. Cependant, j'ai simplifié la question dans l'espoir qu'il serait de travailler dans ma situation d'origine. Pourriez vous s'il vous plaît prendre un coup d'oeil quel est le problème si nous avons des types génériques:
T1[] xn = new T1[N] {x_1, ..., x_N};
T2[] ind = new T2[N] {i_1, ..., i_N};
T2 I = ind[0]
À l'aide de la solution fournie, j'obtiens une erreur "Délégué" du Système.Func "ne prenez pas 2 arguments":
T1[] y = xn.Where((x, idx) => ind[idx] == I).ToArray();
Merci beaucoup
OriginalL'auteur Oleg Shirokikh | 2013-04-03
Vous devez vous connecter pour publier un commentaire.
Comment à ce sujet:
Il utilise la deuxième, moins populaire,
Where
surcharge:Énumérable.Où<TSource > (IEnumerable < TSource>, Func < TSource, Int32, Boolean>)
qui a index de l'élément disponible en tant que prédicat paramètre (appelé
idx
dans ma solution).Version générique
Utilisation
Générique +
double
versionIl est très gentil, merci. Pourriez-vous s'il vous plaît regardez la version éditée de la question?
Pour les génériques, vous devez vous assurer
T2 == T2
(ouT2.Equals(T2)
) est défini - ajouter contrainte génériquewhere T2 : IEquatable
Pouvez-vous conseils comment dois-je intégrer cette contrainte?
Voir mon jour de réponse, monsieur.
OriginalL'auteur MarcinJuraszek
C'est un classique de l'utiliser pour Enumerable.Zip, qui s'exécute par le biais de deux enumerables parallèle à l'eachother. À l'aide de Zip, vous pouvez obtenir vos résultats avec un seul passage. La suite est complètement de type agnostique, bien que j'utilise
int
s etstring
s pour l'illustration:OriginalL'auteur Joshua Honig