c#将数组分配给列表的更优雅的方法?
我有这个:c#将数组分配给列表的更优雅的方法?,c#,asp.net,listcontrol,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.
// 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是您的朋友:
using System.Linq;
var items = Types
.Select (rec => ListItem
{
Text = Rec.Type;
Value = Rec.ID.ToString();
}
LstChangeLogType.Items.AddRange(items);
var changeLogTypes = ChangeLogFunctions.GetAllChangelogTypes()
.Select(x => new ListItem {
Text = x.Type,
Value = x.ID.ToString() })
.ToList();
Select
部分将每个ChangeLogType
投影到一个列表项
,并且ToList()
将结果序列转换为一个列表
这是假设您真的想要一个包含所有这些条目的新列表。如果您需要将结果添加到现有列表中,您可以在不使用ToList
调用的情况下添加结果,但使用Select
调用的结果在现有列表中调用AddRange
关于LINQ的一般知识和LINQ到对象的具体知识非常值得学习,它可以使所有类似的事情变得更加简单。是的,LINQ到对象是您的朋友:
var changeLogTypes = ChangeLogFunctions.GetAllChangelogTypes()
.Select(x => new ListItem {
Text = x.Type,
Value = x.ID.ToString() })
.ToList();
Select
部分将每个ChangeLogType
投影到一个列表项
,并且ToList()
将结果序列转换为一个列表
这是假设您真的想要一个包含所有这些条目的新列表。如果您需要将结果添加到现有列表中,您可以在不使用ToList
调用的情况下添加结果,但使用Select
调用的结果在现有列表中调用AddRange
关于LINQ的一般知识,特别是LINQ到对象的知识,非常值得学习,因为它可以使像这样的各种事情变得更简单。LINQ
LstChangeLogType.Items = Types.Select(x => new ListItem()
{ Text = x.Type, Value = x.ID.ToString() }).ToList();
林克
使用一些LINQ扩展方法:
LstChangeLogType.AddItems.AddRange(
Types.Select(t =>
new ListItem() { Text = t.Type, Value = t.ID.ToString() }).ToArray());
使用一些LINQ扩展方法:
LstChangeLogType.AddItems.AddRange(
Types.Select(t =>
new ListItem() { Text = t.Type, Value = t.ID.ToString() }).ToArray());
=>lambda表达式使用对象初始值设定项为ListItem赋值。这些项实际上是在调用AddRange时创建的,就像AddRange的foreach一样。=>lambda表达式使用对象初始值设定项为ListItem赋值。实际上,当调用AddRange时会创建这些项,就像AddRange的foreach一样。我想不需要
.ToArray()
。@Henk-取决于。items
=列表项集合
,因为它是基于IList
而不是IList
,所以没有AddRange(IEnumerable)
重载。我认为不需要.ToArray()
。@Henk-取决于.Items
=列表项集合
,因为它是基于IList
而不是IList
构建的,所以没有添加范围(IEnumerable)
重载。