C# C语言中优化的几个循环#

C# C语言中优化的几个循环#,c#,for-loop,optimization,C#,For Loop,Optimization,我正在寻找一种更好(又称更快)的方法来执行7 for循环,负责将数据从我的应用程序的旧版本导入到新版本,并提供一些修改。循环遍历7个不同的数据表,遍历每个行,并使用其列中的值创建一个新的树项元素。每个数据表最多可容纳1,5k个条目(或行) 逻辑如下: 第一个循环负责创建树的根元素,因此必须在其余循环之前执行 至于其他6个,在每次迭代中,它将检查DataRow是否包含要添加到先前创建的相应TreeItem中的有效信息 由于我需要检查TreeItem是否已添加到循环的第一个for,因此我创建了一个

我正在寻找一种更好(又称更快)的方法来执行7 for循环,负责将数据从我的应用程序的旧版本导入到新版本,并提供一些修改。循环遍历7个不同的
数据表
,遍历每个
,并使用其列中的值创建一个新的
树项
元素。每个
数据表
最多可容纳1,5k个条目(或

逻辑如下:

  • 第一个循环负责创建树的根元素,因此必须在其余循环之前执行
  • 至于其他6个,在每次迭代中,它将检查
    DataRow
    是否包含要添加到先前创建的相应
    TreeItem
    中的有效信息
  • 由于我需要检查
    TreeItem
    是否已添加到循环的第一个
    for
    ,因此我创建了一个
    Dictionary
    ,它将存储每个添加的项及其名称。稍后,我简单地使用带有
    .ContainsKey
    条件的
    if语句
我需要的是优化这个操作,因为现在它需要花费太长时间才能完成。请记住,不仅代码优化会有所帮助,而且任何关于如何应用相同逻辑并以不同方式获得相同结果的想法都将受到赞赏。例如,我宁愿更改这部分代码,也不愿更改Add操作。我将留下一些代码片段,不确定它们是否有帮助

 private bool ImportItems()
        {
            #region Builds up the structure of the old OptProcess data

            //...Creates DataSets, DataTables and Columns

            #endregion

            try
            {
                //get all the old data from the file
            }
            catch (Exception exc)
            {
                Trace.WriteLine(System.DateTime.Now.ToString() + " - " + exc.ToString());
                Trace.WriteLine(System.DateTime.Now.ToString() + " - " + " ");
                return false;
            }

            //create a dictionary containing the imported items and its name
            Dictionary<string, customType> AllImportedItems = new Dictionary<string, customType>();

            for (int i = 0; i < tableRoots.Rows.Count; i++ )
            {
                if (tableRoots.Rows[i] != null)
                {
                    DataRow r = tableRoots.Rows[i];

                    //...Do some operations and add the item

                    //add it to the list, alongside its original name
                    AllImportedItems.Add(name, item);
                }          
            }

            for (int i = 0; i < table2.Rows.Count; i++ )
            {
                if (table2.Rows[i] != null)
                {
                    DataRow r_child = table2.Rows[i];
                    if (AllImportedItems.ContainsKey((string)r_child["Name"]))
                    {
                        //...Do some operations and Add the item
                    }
                }
            }

            //Other 5 for loops similar to the previous one goes on here...
            //...

            return true;
        }
private bool ImportItems()
{
#区域建立旧OptProcess数据的结构
//…创建数据集、数据表和列
#端区
尝试
{
//从文件中获取所有旧数据
}
捕获(异常exc)
{
Trace.WriteLine(System.DateTime.Now.ToString()+“-”+exc.ToString());
Trace.WriteLine(System.DateTime.Now.ToString()+“-”+”);
返回false;
}
//创建包含导入项及其名称的词典
Dictionary AllImportedItems=新字典();
for(int i=0;i
更新:

不管是好是坏,我将尝试更好地解释“导入”过程:

  • 在应用程序的上一个版本中,我单击“Export items”,这将创建一个.inf文件,基本上是一个.xml文件,其中填充了有关所有现有项目的信息
  • 然后,在新版本的应用程序上,我单击“导入项目”,选择.inf文件,使用
    .ReadXml(pathofthefile)
    ,然后将所有这些信息传递到数据集,这样我就可以根据需要获取这些信息,并将其存储在新格式中,正确地将其分配给新项目字段

打开你的密码,他们会帮你的。啊。。好的旧数据表。我记得以前和这些人打过架。请随意跳到CR,但请确保您发布了所有代码(而不是“执行某些操作”),否则您的主题将因为是示例代码而被关闭为非主题。除非有其他限制,否则编写SSIS包几乎总是比较容易()将数据从一种格式转换为另一种格式。我将首先重构此方法,因为它相当大,因此更具可读性。您可以将此方法的一部分提取到另一种方法中,该方法使用一个数据表并在其中执行循环,然后您可以优化操作。您还可以使用Datatable.AsEnumerable实现LINQ来操作其数据。分而治之:首先,分离关注点的层次。获取从数据表读取的代码,并使其建立一个数据点的元结构,该结构将表示最终的
。然后编写采用此元结构的代码,并创建一个全新的
(或根据需要进行更新)。优化领域:从数据表读取并构建树的代码可能是多线程的,以显著加快速度,甚至考虑到可能需要锁定元结构。打开代码,它们将帮助您。啊。。好的旧数据表。我记得以前和这些人打过架。请随意跳到CR,但请确保您发布了所有代码(而不是“执行某些操作”),否则您的主题将因为是示例代码而被关闭为非主题。除非有其他限制,否则编写SSIS包几乎总是比较容易()将数据从一种格式转换为另一种格式。我将首先重构此方法,因为它相当大,因此更具可读性。您可以将此方法的一部分提取到另一种方法中,该方法使用一个数据表并在其中执行循环,然后您可以优化操作。您还可以使用Datatable.AsEnumerable实现LINQ来操作其数据。分而治之:首先,分离关注点的层次。获取从数据表读取的代码,并将其设为b