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

本文关键字:方法 列表 数组 分配 | 更新日期: 2023-09-27 17:58:59

我有这个:

// 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的数组,然后将每个数组添加到列表控件中。有更优雅的方法吗?每次做这个或类似的事情时,我都感觉自己在重复代码。

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

是的,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>

这是假设您真的想要一个包含所有这些条目的列表。如果需要将结果添加到现有列表中,则不需要ToList调用,而是使用Select调用的结果在现有列表上调用AddRange

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

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

Linq?

LstChangeLogType.Items = Types.Select(x => new ListItem() 
                     { Text = x.Type, Value = x.ID.ToString() }).ToList();
using System.Linq;
var items = Types
  .Select (rec => ListItem
    {
      Text = Rec.Type;
      Value = Rec.ID.ToString();
    }
LstChangeLogType.Items.AddRange(items);

使用一些LINQ扩展方法:

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