Disons qu'il y a deux tableaux: Je dois filtrer la matrice ci-dessus lorsque la valeur code> utilisateur code> est vide puis rejoindre ou zip les deux ensemble. La sortie finale doit être comme suit: p> Comment cela peut-il être fait à l'aide de LINQ? P> P>
5 Réponses :
On dirait que vous voulez réellement "zip" les données ensemble (pas rejoindre) - c'est-à-dire paire par paire; Est-ce exact? Si tel est le cas, simplement: à l'aide de l'opération zip code> de ici : p>
Oups, je n'ai pas bien formé l'exemple, les valeurs dans les deux array ne correspondent pas du tout. Veuillez vous reporter à la question mise à jour.
Je me suis rendu compte que; remplacé par "zip"
Il semble un exemple canonique assez sûr ;-p
On dirait que je dois aller de loin dans Linq. Merci pour l'exemple qui fonctionne.
Oui, mon objectif est d'avoir Marc et Jon poster la réponse exacte que j'aurais pour que je n'ai pas à faire. Me sauve du temps. Merci les gars!
@ERIFLIPPERT, il y a de la place pour d'autres réponses Linq, telles qu'un (indexé> SELECT CODE> et Agrégation CODE> pour atteindre le zip; Cela devait être tard dans la journée pour vous trois les gars. ;-) Je fournis deux réponses i> alternatives i> pour utiliser zip code>.
Pour un démarrage, vous avez besoin d'un opérateur code> zip code> pour zip les deux tableaux ensemble. Voici une version abrégée du code de Blog Eric Lippert (aucune erreur de contrôle d'erreur dans cette version, juste pour la brièveté): Notez que Ensuite, vous devez simplement appliquer un filtre et une projection. Donc, nous obtenions: p> zip code> sera dans les bibliothèques standard pour .NET 4.0. < / P>
En complément des réponses déjà postées, voici une solution sans utiliser la méthode ZIP. Cela suppose que les deux tableaux ont la même longueur.
var pairs = from idx in Enumerable.Range(0, title.Length)
let pair = new {Title = title[idx], User = user[idx]}
where !String.IsNullOrEmpty(pair.User)
select String.Format("{0}:{1}", pair.Title, pair.User);
Comme un autre ajout aux réponses précédentes, Zip est généralement défini et utilisé conjointement avec un type et donc: p> Toile code>. Cela soulage l'utilisateur de devoir fournir une fonction RESUNTEnector code>. public static IEnumerable<Tuple<TFirst, TSecond>> Zip<TFirst, TSecond>
(this IEnumerable<TFirst> first, IEnumerable<TSecond> second)
{
using (IEnumerator<TFirst> e1 = first.GetEnumerator())
using (IEnumerator<TSecond> e2 = second.GetEnumerator())
{
while (e1.MoveNext() && e2.MoveNext())
yield return new Tuple<TFirst, TSecond>(e1.Current, e2.Current);
}
}
En regardant la réponse de Marc (et finalement, la méthode code> zip code> à partir de .NET 4), il existe une quantité importante de frais généraux pour énumérer et rejoindre des lignes où elles sont finalement jetées; peut-il être fait sans ces déchets?
En regardant la réponse de Jon, créant une projection d'entités dynamiques pour référencer les données existantes, puis créer un nouvel ensemble d'entités à partir de ce miroir pourrait être dissuasif pour utiliser cette méthode si le total Le nombre de lignes était trop grand. p>
La snippette ci-dessous utilise les références aux données d'origine et les seuls les individus projetés em> gaspillé sont ceux qui ont des chaînes nulelles qui sont ensuite supprimées. De plus, l'énumération des données est maintenue au minimum. P>
int index = 0;
user.Aggregate (new List<string>(),
(result, usr) =>
{
if (string.IsNullOrEmpty(usr) == false)
result.Add(string.Format("{0}:{1}", title[index], usr));
++index;
return result;
} )
zip code> est maintenant une méthode standard à partir de .NET 4.0. msdn.microsoft.com/en-us/library/dd267698.aspx