c # Более элегантный способ присвоить массив списку? - PullRequest
1 голос
/ 13 июня 2011

У меня есть это:

// 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, а затем добавляет каждый из них в элемент управления списком.Есть ли более элегантный способ сделать это?Я чувствую, что повторяю код каждый раз, когда делаю это или что-то подобное.

Ответы [ 5 ]

5 голосов
/ 13 июня 2011

Да, 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 to Objects в частности - это может сделать все подобные вещи намного проще.

2 голосов
/ 13 июня 2011

Использование некоторых методов расширения LINQ:

LstChangeLogType.AddItems.AddRange(
    Types.Select(t => 
        new ListItem() { Text = t.Type, Value = t.ID.ToString() }).ToArray());
2 голосов
/ 13 июня 2011

Linq?

LstChangeLogType.Items = Types.Select(x => new ListItem() 
                     { Text = x.Type, Value = x.ID.ToString() }).ToList();
2 голосов
/ 13 июня 2011
var range = Types.Select(rec => 
       new ListItem { Text = rec.Type, Value = rec.ID.ToString() });

LstChangeLogType.AddRange(range);
2 голосов
/ 13 июня 2011
using System.Linq;

var items = Types
  .Select (rec => ListItem
    {
      Text = Rec.Type;
      Value = Rec.ID.ToString();
    }

LstChangeLogType.Items.AddRange(items);
...