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

问题描述 投票:-1回答:1

我编写了一个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();
}

我使用此代码来获取数组中的任何字符组合。

当数组的长度达到3000或更多时,程序就会卡住。我该如何解决这个问题?

因为根据我的应用程序的需要,我的数组的大小必须很大。

首先,我使用普通字符串来获取组合,我的代码如下所示:

string s = "";

而不是这个:

StringBuilder sb = new StringBuilder();

我认为正常字符串的最大长度可能存在问题,因此我将其更改为StringBuilder,但问题并未解决。

这个问题是否可以解决,或者我应该使用替代方案?

c# performance for-loop
1个回答
3
投票

你的程序不会卡住,而是因为它只在一个线程上运行需要很长时间才能完成。

你可能想要使用Parallel.For,它的迭代可以并行运行。

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


另外,请注意,使用StringBuilder作为累加器然后在循环内执行sb.Append(arr[counter].ToString());是次优的。不要打电话给toString,只需追加即可。

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

最后,您需要对共享状态保持谨慎,因此我建议您在执行并行处理时考虑一些因素。

© www.soinside.com 2019 - 2024. All rights reserved.