c#更优雅的方式将数组分配给列表?

时间:2011-06-13 19:12:00

标签: c# asp.net listcontrol

我有这个:

// 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 个答案:

答案 0 :(得分:5)

是的,LINQ to Objects是你的朋友:

var changeLogTypes = ChangeLogFunctions.GetAllChangelogTypes()
                                       .Select(x => new ListItem { 
                                                      Text = x.Type,
                                                      Value = x.ID.ToString() })
                                       .ToList();

Select部分将每个ChangeLogType投射到ListItemToList()将生成的序列转换为List<ListItem>

这假设你真的想要一个带有所有这些条目的 new 列表。如果您需要将结果添加到现有列表中,则可以在没有ToList调用的情况下执行此操作,但在现有列表上调用AddRange,结果为{ {1}}致电。

非常值得学习更多关于LINQ和LINQ to Objects的信息 - 它可以使这类事情变得更加简单。

答案 1 :(得分:2)

using System.Linq;

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

LstChangeLogType.Items.AddRange(items);

答案 2 :(得分:2)

var range = Types.Select(rec => 
       new ListItem { Text = rec.Type, Value = rec.ID.ToString() });

LstChangeLogType.AddRange(range);

答案 3 :(得分:2)

LINQ的?

LstChangeLogType.Items = Types.Select(x => new ListItem() 
                     { Text = x.Type, Value = x.ID.ToString() }).ToList();

答案 4 :(得分:2)

使用一些LINQ扩展方法:

LstChangeLogType.AddItems.AddRange(
    Types.Select(t => 
        new ListItem() { Text = t.Type, Value = t.ID.ToString() }).ToArray());