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

时间:2017-12-16 19:59:45

标签: 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;
    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,但问题并未修复。

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

1 个答案:

答案 0 :(得分:3)

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

您可能希望使用Parallel.For,其迭代可以并行运行。

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

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

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

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