LINQ而不是IEnumerable上的ForEach

时间:2017-09-18 15:49:44

标签: c# .net linq c#-4.0

我有一个IEnumerable对象,其中有一个名为Data的字段。 Data的值由';'分隔。 我需要将Data';'分开并将其分配到同一个IEnumerable中的另一个字段中,这是一个数组元素。 例如:

IEnumerable<Object> = 
[{
    Data = "123;345",
    DataList = {}
},
{
     Data = "32424;87878",
    DataList = {}
}] 

并继续..

我需要在每行中拆分Data并分配到同一行中的DataList。 任何人都可以提供lambda表达式来做同样的事情

1 个答案:

答案 0 :(得分:1)

暂停表现暂时我将从内联&#34;优雅&#34;开始(基于意见) 替代传统ForEach 问题的解决方案:

collection.ToList().ForEach(item => { item.DataList = item.Data.Split(';'); });

现在,看ReferenceSource ForEach背后的实际情况,这是一个简单的循环:

for(int i = 0 ; i < _size; i++) {
    /* O(1) code */
    action(_items[i]);
}

请注意,这不是一个linq解决方案。它使用lambda表达式,但ForEach不是linq的函数

现在回到表演。有两个问题。

  1. 不太重要的是,对于内部循环的每次迭代,都会对传递的Action进行另一个函数调用。
  2. 更重要的是,如所描述的那样,对象是一个 IEnumerable<T>ForEachIList的一种方法。因此有 是对ToList()的调用,它在执行时创建一个新集合 O(n)这是不需要的。
  3. 我只是采用简单的直接解决方案:

    foreach(var item in collection)
    {
        item.DataList = item.Data.Split(';');
    }
    

    关于linq的一般说明:

    1. Linq用于对集合进行操作,而不是真正用于更新枚举的项目。这里需要更新操作,因此linq不是最合适的解决方案。
    2. 性能 - 对于内存中的集合,当deffer执行相关且非linq实现不是懒惰时,linq只会提高性能。当使用linq-to-X(例如某些数据库)时,它是一个完全不同的世界,并且在很大程度上取决于特定的linq提供者。总的来说,它可以帮助您在单个数据库查询中执行操作,否则,如果未在数据库中实现,则将在多个查询中执行操作。
    3. 值得一读:Is a LINQ statement faster than a 'foreach' loop?