Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.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# 如何解决两个嵌套for循环被卡住的问题?_C#_Performance_For Loop - Fatal编程技术网

C# 如何解决两个嵌套for循环被卡住的问题?

C# 如何解决两个嵌套for循环被卡住的问题?,c#,performance,for-loop,C#,Performance,For Loop,我编写了一个C#Windows窗体应用程序,其中有两个嵌套的for循环,如下所示: List<int> My_LIST = new List<int>(); List<string> RESULT_LIST = new List<string>(); int[] arr = My_LIST.ToArray(); for (int i = 0; i < arr.Length; i++) { int counter = i;

我编写了一个C#Windows窗体应用程序,其中有两个嵌套的for循环,如下所示:

List<int> My_LIST = new List<int>();

List<string> RESULT_LIST = new List<string>();
int[] arr = My_LIST.ToArray();

for (int i = 0; i < arr.Length; i++)
{
    int counter = i;
    for (int j = 1; j <= arr.Length; j++)
    {
        if (counter == arr.Length)
        {
            counter = 0;
        }

         sb.Append(arr[counter].ToString());
         RESULT_LIST.Add(sb.ToString());
         counter++; 
     }

    sb.Clear();
}
string s = "";
与此相反:

StringBuilder sb = new StringBuilder();
我认为正常字符串的最大长度可能有问题,因此我将其更改为
StringBuilder
,但问题没有得到解决


这个问题可以解决吗?还是我应该使用其他方法

您的程序没有被卡住,而是需要很长时间才能完成,因为它只在一个线程上运行

您可能希望使用它的迭代可以并行运行的

我首先建议并行化外部for循环,然后测试是否有任何性能改进,如果没有,那么也并行化内部循环。在大多数情况下,将外部for循环并行化就足够了


另外,请注意使用
StringBuilder
作为累加器,然后执行
sb.Append(arr[counter].ToString())次优。根本不要调用
toString
,只需追加即可

但是,在执行并行处理时,请记住
StringBuilder
不是线程安全的,因此,最好使用
字符串
,而不是尝试引入锁定或任何类似的方法来保留
StringBuilder


最后,您需要对共享状态保持谨慎,因此我建议您研究一下在执行并行处理时应考虑的问题。

您需要使用任务或线程来完成此任务,因为您的代码占用的资源太多,因此主线程(即GUI的线程)无法完成直到您的操作完成。
sb.ToString()
每次调用时都需要分配一个新的
字符串。这不是StringBuilder的预期用途。根据我的测试,1000个项目的内存使用量为3GB。如果你想获得更高的收入,你必须重新设计你的计划以避免如此巨大的分配。这取决于你为什么需要它。要将其保存到文件中吗?很好,只需保存它,不要将其存储在内存中。你想重复一遍吗?很好,只是使IEnumerable,而不是将其全部存储在内存中。你需要用简单的语言描述你正在解决的问题。这个代码很奇怪,我真的不知道代码的目的是什么。你的问题很有可能得到不同的解决。谢谢你的帮助。您是对的,不需要
.ToString()