1

我有这个:

// 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 数组,然后将每一个添加到列表控件中。有没有更优雅的方式来做到这一点?我觉得每次执行此操作或类似操作时我都在重复代码。

4

5 回答 5

5

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

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

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

这是假设您真的想要一个包含所有这些条目的新列表。如果您需要将结果添加到现有列表中,您可以在没有ToList调用的情况下执行此操作,而是使用调用AddRange结果调用现有列表Select

学习更多关于 LINQ 的一般知识,特别是 LINQ to Objects 是非常值得的——它可以使各种类似的事情变得更简单。

于 2011-06-13T19:16:56.727 回答
2
using System.Linq;

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

LstChangeLogType.Items.AddRange(items);
于 2011-06-13T19:16:09.110 回答
2
var range = Types.Select(rec => 
       new ListItem { Text = rec.Type, Value = rec.ID.ToString() });

LstChangeLogType.AddRange(range);
于 2011-06-13T19:16:33.187 回答
2

林克?

LstChangeLogType.Items = Types.Select(x => new ListItem() 
                     { Text = x.Type, Value = x.ID.ToString() }).ToList();
于 2011-06-13T19:17:41.417 回答
2

使用一些 LINQ 扩展方法:

LstChangeLogType.AddItems.AddRange(
    Types.Select(t => 
        new ListItem() { Text = t.Type, Value = t.ID.ToString() }).ToArray());
于 2011-06-13T19:18:22.750 回答