【问题标题】:LINQ instead of ForEach on IEnumerableLINQ 而不是 IEnumerable 上的 ForEach
【发布时间】:2017-09-18 15:49:43
【问题描述】:

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

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

然后继续..

我需要将每一行中的Data 拆分并分配给同一行中的DataList。 谁能提供一个 lambda 表达式来做同样的事情

【问题讨论】:

  • 为什么选择 LINQ?这就是你在 foreach 循环中使用 String.Split() 所做的事情。
  • Linq 比简单的 ForEach 慢!不多,但它是
  • Just for performance
  • LINQ 的定义并不快,它只是隐藏了代码中丑陋的循环。 Q 代表“查询”,而不是“副作用”。

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


【解决方案1】:

暂时搁置性能我将从内联“优雅”(基于意见) 解决传统的问题的解决方案开始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&lt;T&gt;ForEachIList 的一个方法。因此有 是对ToList() 的调用,它在执行时创建一个新集合 O(n) 不需要。

我会选择简单直接的解决方案:

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

作为关于 linq 的一般说明:

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

值得一读:Is a LINQ statement faster than a 'foreach' loop?

【讨论】:

  • 我想我对 LINQ 和 Lambda 感到困惑。因此,如果我做对了,将其设为 Lambda 表达式也不会提高性能,对吧?它只是使代码更具可读性。 Esp,在这种情况下,我们需要先转换为 List。我的理解正确吗?
  • @Mnu - 很可能,很多人一开始会混淆这两者。 linq,在方法语法中基本上是将lambas传递给不同的函数。请注意,当然也没有性能改进,很可能与下面的相同
  • @Mnu - 是的 :) 我想说特别是因为需要将集合转换为列表。
  • 感谢大家的所有投入。清除了一个非常大的混乱。感谢您宝贵的时间。
猜你喜欢
  • 2011-08-07
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2010-09-17
相关资源
最近更新 更多