11
votes

LINQ "ZIP" dans la matrice String

Disons qu'il y a deux tableaux: xxx

Je dois filtrer la matrice ci-dessus lorsque la valeur utilisateur est vide puis rejoindre ou zip les deux ensemble. La sortie finale doit être comme suit: xxx

Comment cela peut-il être fait à l'aide de LINQ?


1 commentaires

zip est maintenant une méthode standard à partir de .NET 4.0. msdn.microsoft.com/en-us/library/dd267698.aspx


5 Réponses :


9
votes

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: xxx

à l'aide de l'opération zip de ici : xxx


6 commentaires

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 et Agrégation pour atteindre le zip; Cela devait être tard dans la journée pour vous trois les gars. ;-) Je fournis deux réponses alternatives pour utiliser zip .



10
votes

Pour un démarrage, vous avez besoin d'un opérateur zip 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é): xxx

Notez que zip sera dans les bibliothèques standard pour .NET 4.0. < / P>

Ensuite, vous devez simplement appliquer un filtre et une projection. Donc, nous obtenions: xxx


0 commentaires

6
votes

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);


0 commentaires

0
votes

Comme un autre ajout aux réponses précédentes, Zip est généralement défini et utilisé conjointement avec un type Toile code>. Cela soulage l'utilisateur de devoir fournir une fonction RESUNTEnector code>. xxx pré>

et donc: p>

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);
    }
}


0 commentaires

0
votes

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;
                      } )


0 commentaires