【问题标题】:LINQ .ToArray doing some additional calculations before adding the rowLINQ .ToArray 在添加行之前做一些额外的计算
【发布时间】:2013-03-12 17:06:39
【问题描述】:

我有以下 linq 查询

 foreach (var row in nodes.
      Select(tr => tr.Elements("td")
       .Select(td => td.InnerText.TrimEnd())
       .ToArray()))
{
   mydatatable.Rows.Add(row);
}

我可以在 linq 语法中基于其他数组索引的值向数组添加元素,如算术计算,而不必再次循环吗?

例如,结果数组看起来像["xx","9.4",1.4"],我正在尝试添加另一个元素,例如第二个元素乘以第三个元素,所以它看起来像["xx","9.4","2","18.8"],并且肯定是字符串格式,所以需要先转换成双倍然后再乘以字符串

【问题讨论】:

  • 你能展示你在没有 linq 的情况下要做什么吗?
  • 我在这里看不到任何算术计算。看起来你也在解析 html
  • 你能展示一个输入和输出的例子吗?
  • @AzharKhorasany 一次又一次地这样做是什么意思?据我所知,这与将其置于循环之外没有什么不同
  • 备注(与您的问题无关):您不需要 .ToArray() 此处。 foreach 与来自.SelectIEnumerable 配合良好。

标签: c# linq


【解决方案1】:

在这种情况下您不需要数组。考虑IList<T> 并在LINQ 之外进行这些计算,以提高性能、可读性和访问性。

IList<int> rows = nodes.Select(tr => tr.Elements("td")).Select(td => Convert.ToInt32( td.InnerText.TrimEnd())).ToList();
rows.Add(rows[1] * rows[2]);

注意:我知道您可能没有整数,出于我投射的示例代码的目的,否则您无法相乘。

IList<string> strs = nodes.Select(tr => tr.Elements("td")).Select(td => td.InnerText.TrimEnd()).ToList();
var ints = strs.Select(str => str.TryGetInt()).Where(i => i.HasValue).Select(i => i.Value);
strs.Add((ints[0] * [ints[1]).ToString());

public static class Extensions
{
  public static int? TryGetInt(this string item)
  {
    int i;
    bool success = int.TryParse(item, out i);
    return success ? (int?)i : (int?)null;
  }
}

【讨论】:

  • 问题是它混合了字符串、整数和小数
  • @user1590636 我已经发布了替代解决方案
  • 确实认为这会比不使用 LINQ 进行另一个循环更快,其他看起来很棒:)
  • @user1590636 现在你的大部分工作都是在循环之外完成的,你只需要遍历你的字符串值。如果您愿意,请致电ToArray()。如果您想要一个正确的答案,请尝试对两种不同的方法进行基准测试。以上只是为了让你到达你想去的地方:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2012-01-22
  • 2017-08-17
相关资源
最近更新 更多