Je suis nouveau dans LINQ, j'ai le LINQ suivant:

 var number_ofCPtype = (from DataRow s in resultFaultCrewprCurrent[1].AsEnumerable()
       group s by s.Field<string>("cp_type") into g
       select new
       {
           mm = g.Key ,
           list = g.Count()
       }).ToList();

Je veux ajouter un champ supplémentaire, appelez-le (couleur) et remplissez les conditions suivantes:

  if (g.key=="Stiven")
    color ="blue"
  if(g.key=="Alex")
    color ="red"
  if(g.key=="Jack")
    color ="green"
0
mrslt 23 mai 2018 à 14:59

3 réponses

Meilleure réponse

Vous pouvez utiliser:

var query = from row in resultFaultCrewprCurrent[1].AsEnumerable()
            group row by s.Field<string>("cp_type") into typeGroup
            select new {
               mm = typeGroup.Key ,
               list = typeGroup.Count(),
               color = GetColor(typeGroup.Key) 
            };
var number_ofCPtype = query.ToList();

string GetColor(string name)
{
   string color;
   if (name == "Stiven")
     color = "blue";
   else if(name == "Alex")
     color = "red";
   else if(name == "Jack")
     color = "green";
   else
     color = defaultColor; // TODO
   return color;
}

Ou utilisez un Dictionary<string, string> comme mappage.

1
Tim Schmelter 23 mai 2018 à 12:12

Puisque vous avez déjà matérialisé vos données avec .AsEnumerable(), vous serez en mesure de fournir n'importe quelle fonction de mappage arbitraire en prenant la clé de regroupement et en la mappant à une couleur.

Si les performances sont importantes, je suggérerais cependant que vous déplaciez le mappage dans un Dictionary statique à portée de classe, le long des lignes de:

private static readonly Dictionary<string, string> MyColourMap 
= new Dictionary<string, string>
{
   ["Stiven"] = "blue",
   ["Alex"] = "red",
   ["Jack"] = "green"
};

Que vous pouvez ensuite utiliser dans votre projection comme ceci:

select new
{
  mm = g.Key,
  list = g.Count(),
  color = MyColourMap[g.Key] // Lookup the corresponding value
})
.ToList();

Une mise en garde: vous devrez peut-être vous méfier et éviter de tenter de mapper un élément qui ne figure pas dans le dictionnaire, car cela entraînerait un KeyNotFoundException.

1
StuartLC 23 mai 2018 à 12:09

Utilisez une déclaration de condition en ligne comme ci-dessous:

var number_ofCPtype = (from DataRow s in resultFaultCrewprCurrent[1].AsEnumerable()
                       group s by s.Field<string>("cp_type") into g
                       select new
                       {
                           mm = g.Key ,
                           list = g.Count(),
                           color = (g.key == "Stiven" ? "blue" : (g.key=="Alex" ? "red" : (g.key=="Jack" ? "green" : "undefined")) )
                       }).ToList();
1
Hasan Gholamali 23 mai 2018 à 12:08