【问题标题】:Aggregate methods to use with IEnumerable lists与 IEnumerable 列表一起使用的聚合方法
【发布时间】:2011-04-08 14:36:11
【问题描述】:

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

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

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);
}

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

【问题讨论】:

    标签: c# asp.net linq list ienumerable


    【解决方案1】:

    你可以写

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

    这些方法由List&lt;T&gt; 类定义。

    如果你有一个任意的IEnumerable&lt;T&gt;,你可以使用LINQ:

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

    【讨论】:

    • 值得注意的是 ForEach 仅在 List 上可用,Linq 不直接实现 IEnumerable ForEach 但是它可以很容易地自己添加。
    【解决方案2】:

    致电Enumerable.Aggregate

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

    也就是说,foreach 语句更好。

    【讨论】:

      【解决方案3】:

      是的,事实上,尽管并非所有这些都是 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
      

      【讨论】:

        【解决方案4】:

        myStringList.ForEach(item => myDataTable.Columns.Add(item));

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

        【讨论】:

          猜你喜欢
          • 2019-10-05
          • 2016-02-10
          • 1970-01-01
          • 1970-01-01
          • 2017-06-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-06
          相关资源
          最近更新 更多