我编写了一个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
,但问题并未修复。
这个问题是否可以解决,或者我应该使用替代方案?
答案 0 :(得分:3)
你的程序没有被卡住,而是需要很长时间才能完成,因为它只在一个线程上运行。
您可能希望使用Parallel.For,其迭代可以并行运行。
我首先建议并行化外部for循环,然后测试是否有任何性能改进,如果没有那么也可以并行化内部循环。在大多数情况下,并行外部for循环可以证明是足够的。
另请注意,使用StringBuilder
作为累加器,然后在循环内执行sb.Append(arr[counter].ToString());
次优。根本不要打电话给toString
,只需追加即可。
但是,在执行并行处理时请注意StringBuilder
不是线程安全的,因此,最好使用String
而不是尝试引入锁定或任何类似的东西来保留StringBuilder
。
最后,您需要对共享状态保持谨慎,因此我建议您在执行并行处理时考虑一些因素。