c # Maneira mais elegante de atribuir uma matriz a uma lista?
-
27-10-2019 - |
Pergunta
Eu tenho isso:
// 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);
}
Ele chama uma função que retorna uma matriz de ChangeLogTypes e adiciona cada um a um controle de lista.Existe uma maneira mais elegante de fazer isso?Sinto que estou repetindo o código cada vez que faço isso ou algo semelhante.
Solução
Sim, LINQ to Objects é seu amigo:
var changeLogTypes = ChangeLogFunctions.GetAllChangelogTypes()
.Select(x => new ListItem {
Text = x.Type,
Value = x.ID.ToString() })
.ToList();
A parte Select
está projetando cada ChangeLogType
em um ListItem
e ToList()
converte a sequência resultante em um List<ListItem>
.
Isso pressupõe que você realmente deseja uma nova lista com todas essas entradas.Se você precisar adicionar os resultados a uma lista existente , faria isso sem a chamada ToList
, mas chamando AddRange
em uma lista existente com o resultado da chamada Select
.
Vale a pena aprender mais sobre LINQ em geral e LINQ to Objects em particular - ele pode tornar todos os tipos de coisas assim muito mais simples.
Outras dicas
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);
Using some LINQ extension methods:
LstChangeLogType.AddItems.AddRange(
Types.Select(t =>
new ListItem() { Text = t.Type, Value = t.ID.ToString() }).ToArray());