我有这个:
// 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数组的函数,然后将每个函数添加到一个列表控件中。有更优雅的方式吗?我觉得每次这样做或类似的事情都会重复编码。
答案 0 :(得分:5)
是的,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>
。
这假设你真的想要一个带有所有这些条目的 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());