Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中ForEach循环的性能改进技巧?_C#_Performance_Optimization - Fatal编程技术网

C#中ForEach循环的性能改进技巧?

C#中ForEach循环的性能改进技巧?,c#,performance,optimization,C#,Performance,Optimization,我需要优化下面的foreach循环。foreach循环需要更多的时间来获取唯一的项 相反,可以将过滤器项转换为列表集合。如果是的话,怎么做。然后,我将采取独特的项目很容易从它 当我在FilterItems中有500000项时,问题就出现了 请提供一些优化以下代码的方法: int i = 0; List<object> order = new List<object>(); List<object> unique = new List<object>

我需要优化下面的
foreach
循环。foreach循环需要更多的时间来获取唯一的项

  • 相反,可以将
    过滤器项
    转换为列表集合。如果是的话,怎么做。然后,我将采取独特的项目很容易从它

  • 当我在FilterItems中有500000项时,问题就出现了

  • 请提供一些优化以下代码的方法:

    int i = 0; 
    List<object> order = new List<object>();
    List<object> unique = new List<object>();
    // FilterItems IS A COLLECTION OF RECORDS. CAN THIS BE CONVERTED TO A LIST COLLECTION DIRECTLY, SO THAT I CAN TAKE THE UNIQUE ITEMS FROM IT.
    foreach (Record rec in FilterItems)
    {
      string text = rec.GetValue(“Column Name”);
      int position = order.BinarySearch(text);
      if (position < 0)
      {
        order.Insert(-position - 1, text);
        unique.Add(text);
      }
      i++;
    }
    
    inti=0;
    列表顺序=新列表();
    List unique=新列表();
    //FilterItems是记录的集合。可以直接将其转换为列表集合,以便从中获取唯一的项。
    foreach(在FilterItems中记录rec)
    {
    string text=rec.GetValue(“列名”);
    int position=order.BinarySearch(文本);
    如果(位置<0)
    {
    顺序。插入(-位置-1,文本);
    唯一。添加(文本);
    }
    i++;
    }
    
    当我们对它一无所知的时候,不清楚你的意思是“把过滤项转换成一个列表”,但是你可以在你得到所有的项目之后,考虑分类,而不是按你的方式去排序:

    var strings = FilterItems.Select(record => record.GetValue("Column Name"))
                             .Distinct()
                             .OrderBy(x => x)
                             .ToList();
    
    在这里使用
    Distinct()
    可以避免对大量相同的项目进行排序-看起来您仍然只需要不同的项目

    如果您希望
    unique
    保持原始顺序,但
    order
    保持相同的项目,只需排序,您可以使用:

    var unique = FilterItems.Select(record => record.GetValue("Column Name"))
                            .Distinct()
                            .ToList();
    var order = unique.OrderBy(x => x).ToList();
    

    现在,
    Distinct()
    不能保证保持顺序,但在当前的实现中它是这样做的,这也是最自然的实现。

    Hi@NicoSchertler谢谢……但是隐式转换是有问题的……你能解释一下怎么做吗……我还需要访问“记录”中的一个方法。还有,当你只添加文本时,为什么要使用
    List
    ?我们怎么知道
    FilterItems
    是否可以转换成列表,当我们什么都不知道的时候?嗨@乔恩·斯基特,谢谢。。我的意思是,我可以直接将“FilterItem”集合绑定到一个列表或任何其他ienumerable集合中吗?我只是问“@Arun:对不起,我还是一点都不明白你的意思-你不是很清楚,你还没有告诉我们FilterItem从何而来……详细地说-“FilterItems”来自一个名为“FilteredCollection”…我可以使用FilterItems[index]从FilterItems访问记录。它有记录集合。我询问是否有机会将此集合直接绑定到列表或Ienumerable(使用隐式或显式转换)@Arun:这并不是很详细-我们甚至还不知道
    FilterItems
    的编译时类型。我也不知道你所说的“直接将此集合绑定到列表”是什么意思“-看起来它已经是某种类型的
    IEnumerable
    。然而,在这一点上,听起来它与这里的主要问题真的是一个不同的问题,所以我建议你问一个包含更多信息的新问题。