0
votes

Joindre une chaîne avec la même propriété à l'aide de LINQ

J'ai un modèle comme ci-dessous xxx pre>

valeurs d'échantillon p> xxx pré>

chaîne de résultat: "rouge / rouge rouge", "jaune", "vert / bleu" strong> p>

Règles de chaîne de sortie p>

  • chaînes séparées avec le même ID par / (exemple: "rouge / rouge clair") puis des virgules séparent toutes les chaînes combinées avec Propps_Order Valeur LI> ul>

    Mise en œuvre actuelle P>

        List<string> _inflections = new List<string>();
        var distinctIDs = inflections_model.Select(x => x.form_id).Distinct(); //find distinct IDs
        foreach (int _id in distinctIDs) //for each distinct ID , join the string  to LIST
        {
         string inflection_val = string.Join(" / ", from item in inflections_model 
                                                          where item.form_id==_id
                                                          select item.props_name );
            _inflections.Add(inflection_val);
        }
        string inflection_string = string.Join(", ", _inflections);  //combine processed STRINGS to a comma separate list 
    


2 commentaires

Confus, lequel devrait être sélectionné comme réponse des commentaires ci-dessous, peu d'entre eux renvoient le même résultat et demandant aux lecteurs d'utiliser la solution optimale pour eux.


Choisissez simplement le premier qui vous a adapté, sinon les gens continueront de poster des réponses comme se produisent maintenant.


5 Réponses :


2
votes

Vous pouvez utiliser LINQ GroupBy et sélectionner:

var data = inflections_model.GroupBy(p=> p.props_id) // this gives you groups
  .Select(g =>  
      String.Join("/", g.OrderBy(r=>r.props_order)
                        .Select(r=>r.props_name)))  
var inflection_string = string.Join(", ",data)


1 commentaires

r => Propps_Order n'existe pas dans le contexte actuel



2
votes

Ceci commande les groupes d'éléments basés sur la valeur la plus basse de props_order dans chaque groupe xxx


0 commentaires

2
votes

Vous devez groupy code> éléments props_id et Props_order comme suivant une seule linq:

    var _inflections = inflections_model.OrderBy(o => o.props_order)
                                                .GroupBy(i => i.props_id)
                                                .Select(s => String.Join("/", s.Select(p => p.props_name)));

    var inflection_string = String.Join(",", _inflections);


1 commentaires

Même vous obtenez une sortie triée, groupby ne garantit pas que la commande sera préservée. Cela fonctionne pour Linq2Objects mais cela ne fonctionnera pas pour SQL par exemple. OrderBy puis GroupBy est trompeur et délicat. Il sera préférable de commander par props_order le groupe lui-même.



2
votes

Vous pouvez essayer ci-dessous la mise en oeuvre xxx

sortie: xxx

. Filet Fiddle


0 commentaires

1
votes
var list = models.OrderBy(x => x.props_order).ToLookup(x => x.props_id, x => x.props_name).Select(name => string.Join("/", name));
var result = string.Join(",", list);
Prints 
  "red/light red,yellow,green/blue"
Better performance with LookupOn machine,GroupBy => takes 1.6215 millisecondsLookup => takes 0.2072 milliseconds

0 commentaires