如何解决两个嵌套循环的问题



我已经编码了一个c#windows表单应用程序,其中有两个用于loops 喜欢下面:

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,但问题没有解决。

这个问题是可以解决的还是我应该使用替代方案?

您的程序不会卡住,而是花了很长时间才能完成,因为它仅在一个线程上运行。

您可能需要并行使用它的迭代可以并行运行。

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


另外,请注意,使用StringBuilder作为累加器,然后在循环中执行sb.Append(arr[counter].ToString()); sub-tim-Oftimal 。完全不要致电toString,只需附加即可。

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

最后,您需要谨慎对待共享状态,因此,我建议您在执行并行处理时要考虑的事情进行一些研究。

最新更新