C# более элегантный способ назначить массив в список?

StackOverflow https://stackoverflow.com/questions/6335061

  •  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());
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top