【问题标题】:Speed up the nested for loops in c#加快c#中的嵌套for循环
【发布时间】:2018-06-01 15:25:59
【问题描述】:

我写了一个程序,它运行良好。但问题是,这需要很多时间来处理。 我在数据表中有超过数百万的数据。所以真的很难等到这个过程完成。我听说了一些关于 LinQ 方法的事情。但我对此并不熟悉。谁能帮我加快我的代码速度。

foreach (var ch in lsCh)
{
    foreach (var dt in lsDt)
    {
        foreach (var cs in lsCs)
        {
            DataRow[] result = Dtsrc.Select("Channel = '" + ch.ToString() + "' AND Date = '" + dt.ToString() + "' AND CPSTime = '" + cs + "'");

            if (result.Length > 0)
            {
                //Some calculation
            }

            Dtsrc.AcceptChanges();
        }
    }
}

【问题讨论】:

  • lsCh,lsDtlsCs 是什么?你想在那里做什么?你不能输入一些代码然后说:改进。 LINQ 也使用循环,通常它只是有助于提高可读性
  • 为了帮助你,你应该提供一些关于算法和你正在迭代的数据的信息。
  • 这些是列表。!我正在尝试使用数据表中的此列表过滤数据@TimSchmelter
  • @Shanmugarajan:什么样的列表?它们包含什么,类的外观如何?另外,你的 for 循环和 if 条件的逻辑是什么?例如:if (result.Length <= l + 1)for (int rr = resRcnt; rr <= l; rr++)。为什么你需要这三个列表?
  • 它包含频道、日期和开始时间。数据表中有相同的详细信息。有了这个列表,想从数据表中获取数据。

标签: c# .net linq for-loop datatable


【解决方案1】:

由于 DataColumns 和列表的类型不清楚,您可能必须相应地更改它们。但也许这向您展示了一种更有效的方法:

我会使用HashSet<T> 而不是List<T>。如果您一般无法更改类型,则可以通过将列表传递给构造函数来创建实例:

var setCh = new HashSet<int>(lsCh);
var setDt = new HashSet<DateTime>(lsDt);
var setCs = new HashSet<DateTime>(lsCs);

现在这个查询应该更有效率了:

var rowsToProcess = Dtsrc.AsEnumerable()
    .Where(r => setCh.Contains(r.Field<int>("Channel")) && setDt.Contains(r.Field<DateTime>("Date")) && setCs.Contains(r.Field<DateTime>("CPSTime")));

foreach (DataRow row in rowsToProcess)
{
    //Some calculation
}

【讨论】:

  • 非常感谢您的帮助。它运作良好。很抱歉让您感到困惑。!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 2023-03-27
  • 2020-07-02
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
相关资源
最近更新 更多