与IEnumerable列表一起使用的聚合方法

时间:2011-04-08 14:36:11

标签: c# asp.net linq list ienumerable

当该不同类型在其构造函数中接受前一种类型时,有没有办法将IEnumerable列表(例如,字符串)“转换”(返回)到不同类型的IEnumerable列表?

例如,DataTable.Columns.AddRange()方法仅接受列列表。有没有办法通过使用LINQ或某种聚合函数提供DataColumn列表来返回string列表?我想代码将粗略地执行以下操作,但是在一行中:

var columnList = new List<DataColumn>();
foreach (var item in myStringList)
{
    columnList.Add(item);
}
return columnList;

同样,是否有一个聚合方法可以获取列表并针对特定方法运行其每个成员?例如,我正在寻找一种单行方式来执行以下类似的foreach循环:

foreach (var item in myStringList)
{
    myDataTable.Columns.Add(item);
}

显然,我正在寻找实际上并非依赖于数据列或字符串的通用答案。

4 个答案:

答案 0 :(得分:3)

你可以写

var newList = list.ConvertAll(x => new Something(x));
list.ForEach(x => DoSomething(x));

这些方法由List<T>类定义。

如果您有任意IEnumerable<T>,则可以使用LINQ:

var newEnumerable = enumerable.Select(x => new Something(x));

答案 1 :(得分:2)

致电Enumerable.Aggregate

List<DataColumn> result = myStringList.Aggregate(
  new List<DataColumn>(),
  (list, item) => { list.Add(item); return list; }
);

return result;

那就是说,foreach声明更好。

答案 2 :(得分:1)

是的,事实上,虽然并非所有这些都是LINQ特定的。 ForEach只是一个List方法。对于你的两个例子:

myStringList.ForEach(x => columnList.Add(x));
// assumes myStringList is a List<T>... otherwise convert your enumerable using ToList()

ForEach方法采用Action并允许您对每个项目执行一些逻辑。因此,如果您想进行转换,那么与select:

结合就很容易了
myStringList.Select(x => new DataColumn(x))
      .ToList()
      .ForEach(x => columnList.Add(x));
// transforms each element of the string by adding some text, then calling foreach 
// on the items

答案 3 :(得分:0)

myStringList.ForEach(item =&gt; myDataTable.Columns.Add(item));

编辑:那不是Linq。对不起,我的错误。