C# более элегантный способ назначить массив в список?
-
27-10-2019 - |
Вопрос
У меня есть это:
// 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);
}
Он вызывает функцию, которая возвращает массив Changelogtypes, а затем добавляет каждый в элемент управления списком. Есть ли более элегантный способ сделать это? Я чувствую, что повторяю код каждый раз, когда делаю это или что -то подобное.
Решение
Да, Linq to Objects - ваш друг:
var changeLogTypes = ChangeLogFunctions.GetAllChangelogTypes()
.Select(x => new ListItem {
Text = x.Type,
Value = x.ID.ToString() })
.ToList();
А Select
часть проецирует каждый ChangeLogType
в ListItem
, а также ToList()
преобразует полученную последовательность в List<ListItem>
.
Это предполагает, что вы действительно хотели новый Список со всеми этими записями. Если вам нужно добавить результаты в существующий Список, вы бы сделали это без ToList
позвонить, но звонок AddRange
в существующем списке с результатом Select
вызов.
Стоит узнать больше о LINQ в целом и LINQ, в частности, в частности - он может сделать все это так проще.
Другие советы
var range = Types.Select(rec =>
new ListItem { Text = rec.Type, Value = rec.ID.ToString() });
LstChangeLogType.AddRange(range);
Линк?
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);
Используя некоторые методы расширения LINQ:
LstChangeLogType.AddItems.AddRange(
Types.Select(t =>
new ListItem() { Text = t.Type, Value = t.ID.ToString() }).ToArray());