【问题标题】:How to use LINQ instead of a foreach loop?如何使用 LINQ 而不是 foreach 循环?
【发布时间】:2014-10-23 21:46:24
【问题描述】:

我想将 foreach 循环转换为 linq 查询,因为 itemList 可以有很多值,并且迭代该列表中的每个值很耗时。可以用 linq 来完成吗?

string fileAsString = File.ReadAllText(filePath);
Match match = Regex.Match(filePath, regx.ToString());

while (match.Success)
{
    string itemToReplace = match.Groups["part"].Value;

    //Use linq instead of the commented out area
    //
    //foreach (var item in itemList)
    //{
    //    if (itemToReplace == macro.Name)
    //    {
    //        fileAsString = fileAsString.Replace(match.Value, item.Value);
    //    }
    //}
    //

    match = match.NextMatch();
}

【问题讨论】:

  • Linq 没有摆脱循环。
  • 是什么让您认为 Linq 会导致更快的执行?
  • linq 不会更快
  • fileAsString 来自哪里?
  • LINQ 并不神奇。如果你有很多替代品要执行,那将需要时间。仅仅让你的代码使用 LINQ 不会使这些替换更快。

标签: c# linq foreach


【解决方案1】:

Aggregate LINQ method(又名fold/reduce operation)对[0..len) 中的n 执行r_{n+1} = f(r_n, x_n),计算结果为r_{n+1}

在替换操作上应用折叠1;

fileAsString = itemList.Aggregate(fileAsString,
    (acc, item) => acc.Replace(match.Value, item.Value));

如果使用Regex.Matches,也可以在外部循环上应用聚合。但是,使用 LINQ 不会改变时间复杂度或使代码运行得更快 - Replace 被称为 same 次数。

[注意:我再次查看了代码,并没有混淆为什么会出现重复替换;以下可能不适用。 Replace 的参数应该是 other 方式吗?]

如果性能是一个问题,最好使用正则表达式Replace with a match evaluator 来处理文件替换。也就是说,尽可能少地创建一个匹配所有项目的模式——它可以像a|b|c 一样具体或更一般。然后在匹配电梯中使用字典查找替换值。


1 条件检查可以移到内部循环之外,因为表达式在循环期间是固定的。虽然这不会影响我这样做的运行时间[出于偏好和],因为它使 LINQ 稍微简单一些。

【讨论】:

    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多