3 votes

Méthode d'extension lambda pour convertir IEnumerable<T> en List<SelectListItem>.

J'ai besoin d'un moyen pour créer une méthode d'extension à partir d'un IEnumerable qui me permettra de renvoyer une liste de SelectListItem.

Par exemple

    public class Role
    {
        public string Name {get;set;}
        public string RoleUID {get;set;}
    }
    IEnumerable<Role> Roles = .../*Get Roles From Database*/
    var selectItemList = Roles.ToSelectItemList(p => p.RoleUID,r => r.Name);

cela me donnerait une liste SelectItemList dont le nom serait l'affichage et le RoleUID la valeur.

IMPORTANT Je veux que ce soit générique afin de pouvoir le créer avec deux propriétés quelconques d'un objet, et pas seulement un objet de type Role.

Comment faire ?

J'imagine quelque chose comme ce qui suit

 public static List<SelectItemList> ToSelectItemList<T,V,K>(this IEnumerable<T>,Func<T,V,K> k)

ou quelque chose comme ça, je sais évidemment que ce serait incorrect.

10voto

JaredPar Points 333733

Pourquoi ne pas simplement combiner les Select y ToList méthodes ?

var selectItemList = Roles
  .Select(p => new SelectListItem { Value = p.RoleUID, Text = p.Name })
  .ToList();

Si vous voulez le placer spécifiquement dans une méthode, vous pouvez définir ToSelectListItem une combinaison de ces deux méthodes.

public static List<SelectListItem> ToSelectListItem<T>(
  this IEnumerable<T> enumerable,
  Func<T, string> getText,
  Func<T, string> getValue) {

  return enumerable
    .Select(x => new SelectListItem { Text = getText(x), Value = getValue(x) })
    .ToList();
}

1voto

Alastair Pitts Points 11677

Que diriez-vous de quelque chose comme ceci ? (note : je n'ai pas testé cette solution, mais elle devrait fonctionner.

    public static List<SelectListItem> ToSelectItemList<T>(this IEnumerable<T> source, Func<T, string> textPropertySelector, Func<T, string> valuePropertySelector, Func<T, bool> isSelectedSelector)
    {
        return source
            .Select(obj => new SelectListItem
            {
                Text = textPropertySelector(obj),
                Value = valuePropertySelector(obj),
                Selected = isSelectedSelector(obj)
            })
            .ToList();
    }

et vous l'utiliseriez de la même manière que votre modèle actuel, à la seule différence que j'ai ajouté un autre sélecteur pour définir le paramètre Selected propriété booléenne.

0voto

hafiz siddiq Points 13

Pourquoi ne pas utiliser quelque chose comme ceci

IEnumerable<SelectListItem> data = Roles.Select(f => new SelectListItem { Value = f.RoleUID, Text = f.Name});

Cela fonctionne pour moi !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X