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)
重载。