C# ¿una forma más elegante de asignar matriz a una lista?
-
27-10-2019 - |
Pregunta
Tengo esto:
// Load changelog types
ChangeLogType[] Types = ChangeLogFunctions.GetAllChangelogTypes();
foreach(ChangeLogType Rec in Types){
ListItem N = new ListItem();
N.Text = Rec.Type;
N.Value = Rec.ID.ToString();
LstChangeLogType.Items.Add(N);
}
Llama a una función que devuelve una matriz de ChangeLogTypes, y luego agrega cada una en un control de lista. ¿Hay una forma más elegante de hacer esto? Siento que estoy repitiendo código cada vez que hago esto o algo similar.
Solución
Sí, Linq to Objects es tu amigo:
var changeLogTypes = ChangeLogFunctions.GetAllChangelogTypes()
.Select(x => new ListItem {
Text = x.Type,
Value = x.ID.ToString() })
.ToList();
los Select
parte es proyectar cada uno ChangeLogType
a un ListItem
, y ToList()
convierte la secuencia resultante en un List<ListItem>
.
Esto supone que realmente querías un nuevo Lista con todas estas entradas. Si necesita agregar los resultados a un existente Lista, lo harías sin el ToList
llamar, pero llamando AddRange
en una lista existente con el resultado del Select
llamar.
Vale la pena aprender más sobre Linq en general y Linq a los objetos en particular: puede hacer todo tipo de cosas como esto mucho más simples.
Otros consejos
var range = Types.Select(rec =>
new ListItem { Text = rec.Type, Value = rec.ID.ToString() });
LstChangeLogType.AddRange(range);
Linq?
LstChangeLogType.Items = Types.Select(x => new ListItem()
{ Text = x.Type, Value = x.ID.ToString() }).ToList();
using System.Linq;
var items = Types
.Select (rec => ListItem
{
Text = Rec.Type;
Value = Rec.ID.ToString();
}
LstChangeLogType.Items.AddRange(items);
Uso de algunos métodos de extensión de LINQ:
LstChangeLogType.AddItems.AddRange(
Types.Select(t =>
new ListItem() { Text = t.Type, Value = t.ID.ToString() }).ToArray());