c#遍历二维数组(或交错数组)的所有组合
遍历多维数组或者交错数组是很件很容易的事,用一个递归就可以了,但是要获取它的所有组合,相对来说就要麻烦很多,正好前面笔者就用到了类似的需求,便随手写了一个,分享一下(此处以交错数组为例,二维数组一样的,略略改动即可):
\
:::: {#highlighter_286712 .syntaxhighlighter .csharp} ::: toolbar :::
+--------------------------------------+----------------------------------------------------------------------------+
| ::: {.line .number1 .index0 .alt2} | :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: container |
| 1 | ::: {.line .number1 .index0 .alt2} |
| ::: | public
{.csharp .keyword} List<
{.csharp .plain}string
{.csharp |
| | .keyword}> ForearchArray(
{.csharp .plain}string
{.csharp |
| ::: {.line .number2 .index1 .alt1} | .keyword}[][] array)
{.csharp .plain} |
| 2 | ::: |
| ::: | |
| | ::: {.line .number2 .index1 .alt1} |
| ::: {.line .number3 .index2 .alt2} | {
{.csharp .plain} |
| 3 | ::: |
| ::: | |
| | ::: {.line .number3 .index2 .alt2} |
| ::: {.line .number4 .index3 .alt1} |
{.csharp .spaces}//以交错数组为例
{.csharp .comments} |
| 4 | ::: |
| ::: | |
| | ::: {.line .number4 .index3 .alt1} |
| ::: {.line .number5 .index4 .alt2} |
{.csharp .spaces}//二维数组,按以下规则替换代码即可:
{.csharp |
| 5 | .comments} |
| ::: | ::: |
| | |
| ::: {.line .number6 .index5 .alt1} | ::: {.line .number5 .index4 .alt2} |
| 6 |
{.csharp .spaces}//array[i].Length 替换 array.GetLength(i)
{.csharp |
| ::: | .comments} |
| | ::: |
| ::: {.line .number7 .index6 .alt2} | |
| 7 | ::: {.line .number6 .index5 .alt1} |
| ::: |
{.csharp .spaces}//array[0][2] 替换 array[0, 2];
{.csharp |
| | .comments} |
| ::: {.line .number8 .index7 .alt1} | ::: |
| 8 | |
| ::: | ::: {.line .number7 .index6 .alt2} |
| |
{.csharp .spaces} |
| ::: {.line .number9 .index8 .alt2} | ::: |
| 9 | |
| ::: | ::: {.line .number8 .index7 .alt1} |
| |
{.csharp .spaces}List<
{.csharp .plain}string
{.csharp |
| ::: {.line .number10 .index9 .alt1} | .keyword}> result =
{.csharp .plain}new
{.csharp |
| 10 | .keyword} List<
{.csharp .plain}string
{.csharp .keyword}>();
{.csharp |
| ::: | .plain} |
| | ::: |
| ::: {.line .number11 .index10 .alt2} | |
| 11 | ::: {.line .number9 .index8 .alt2} |
| ::: |
{.csharp .spaces}int
{.csharp .keyword}[] indexArray =
{.csharp |
| | .plain}new
{.csharp .keyword} int
{.csharp |
| ::: {.line .number12 .index11 .alt1} | .keyword}[array.Length];
{.csharp .plain} |
| 12 | ::: |
| ::: | |
| | ::: {.line .number10 .index9 .alt1} |
| ::: {.line .number13 .index12 .alt2} |
{.csharp .spaces} |
| 13 | ::: |
| ::: | |
| | ::: {.line .number11 .index10 .alt2} |
| ::: {.line .number14 .index13 .alt1} |
{.csharp .spaces}int
{.csharp .keyword} pointer = 0;
{.csharp |
| 14 | .plain} |
| ::: | ::: |
| | |
| ::: {.line .number15 .index14 .alt2} | ::: {.line .number12 .index11 .alt1} |
| 15 |
{.csharp .spaces} |
| ::: | ::: |
| | |
| ::: {.line .number16 .index15 .alt1} | ::: {.line .number13 .index12 .alt2} |
| 16 |
{.csharp .spaces}bool
{.csharp .keyword} run =
{.csharp |
| ::: | .plain}true
{.csharp .keyword};
{.csharp .plain} |
| | ::: |
| ::: {.line .number17 .index16 .alt2} | |
| 17 | ::: {.line .number14 .index13 .alt1} |
| ::: |
{.csharp .spaces} |
| | ::: |
| ::: {.line .number18 .index17 .alt1} | |
| 18 | ::: {.line .number15 .index14 .alt2} |
| ::: |
{.csharp .spaces}int
{.csharp .keyword} lastIndex;
{.csharp |
| | .plain} |
| ::: {.line .number19 .index18 .alt2} | ::: |
| 19 | |
| ::: | ::: {.line .number16 .index15 .alt1} |
| |
{.csharp .spaces} |
| ::: {.line .number20 .index19 .alt1} | ::: |
| 20 | |
| ::: | ::: {.line .number17 .index16 .alt2} |
| |
{.csharp .spaces}while
{.csharp .keyword} (run)
{.csharp .plain} |
| ::: {.line .number21 .index20 .alt2} | ::: |
| 21 | |
| ::: | ::: {.line .number18 .index17 .alt1} |
| |
{.csharp .spaces}{
{.csharp .plain} |
| ::: {.line .number22 .index21 .alt1} | ::: |
| 22 | |
| ::: | ::: {.line .number19 .index18 .alt2} |
| |
{.csharp .spaces}run =
{.csharp .plain}false
{.csharp |
| ::: {.line .number23 .index22 .alt2} | .keyword};
{.csharp .plain} |
| 23 | ::: |
| ::: | |
| | ::: {.line .number20 .index19 .alt1} |
| ::: {.line .number24 .index23 .alt1} |
{.csharp .spaces}System.Text.StringBuilder sbr =
{.csharp |
| 24 | .plain}new
{.csharp .keyword} System.Text.StringBuilder();
{.csharp |
| ::: | .plain} |
| | ::: |
| ::: {.line .number25 .index24 .alt2} | |
| 25 | ::: {.line .number21 .index20 .alt2} |
| ::: |
{.csharp .spaces} |
| | ::: |
| ::: {.line .number26 .index25 .alt1} | |
| 26 | ::: {.line .number22 .index21 .alt1} |
| ::: |
{.csharp .spaces}for
{.csharp .keyword} (
{.csharp |
| | .plain}int
{.csharp .keyword} i = 0; i < array.Length; i++)
{.csharp |
| ::: {.line .number27 .index26 .alt2} | .plain} |
| 27 | ::: |
| ::: | |
| | ::: {.line .number23 .index22 .alt2} |
| ::: {.line .number28 .index27 .alt1} |
{.csharp .spaces}{
{.csharp .plain} |
| 28 | ::: |
| ::: | |
| | ::: {.line .number24 .index23 .alt1} |
| ::: {.line .number29 .index28 .alt2} |
{.csharp .spaces}if
{.csharp |
| 29 | .keyword} (indexArray[i] != array[i].Length - 1)
{.csharp .plain} |
| ::: | ::: |
| | |
| ::: {.line .number30 .index29 .alt1} | ::: {.line .number25 .index24 .alt2} |
| 30 |
{.csharp .spaces}{
{.csharp .plain} |
| ::: | ::: |
| | |
| ::: {.line .number31 .index30 .alt2} | ::: {.line .number26 .index25 .alt1} |
| 31 |
{.csharp .spaces}run =
{.csharp .plain}true
{.csharp |
| ::: | .keyword};
{.csharp .plain} |
| | ::: |
| ::: {.line .number32 .index31 .alt1} | |
| 32 | ::: {.line .number27 .index26 .alt2} |
| ::: |
{.csharp .spaces}}
{.csharp .plain} |
| | ::: |
| ::: {.line .number33 .index32 .alt2} | |
| 33 | ::: {.line .number28 .index27 .alt1} |
| ::: |
{.csharp |
| | .spaces}sbr.Append(array[i][indexArray[i]]);
{.csharp .plain} |
| ::: {.line .number34 .index33 .alt1} | ::: |
| 34 | |
| ::: | ::: {.line .number29 .index28 .alt2} |
| |
{.csharp .spaces}}
{.csharp .plain} |
| ::: {.line .number35 .index34 .alt2} | ::: |
| 35 | |
| ::: | ::: {.line .number30 .index29 .alt1} |
| |
{.csharp .spaces}result.Add(sbr.ToString());
{.csharp .plain} |
| ::: {.line .number36 .index35 .alt1} | ::: |
| 36 | |
| ::: | ::: {.line .number31 .index30 .alt2} |
| |
{.csharp .spaces} |
| ::: {.line .number37 .index36 .alt2} | ::: |
| 37 | |
| ::: | ::: {.line .number32 .index31 .alt1} |
| |
{.csharp |
| ::: {.line .number38 .index37 .alt1} | .spaces}lastIndex = array.Length - 1 - pointer;
{.csharp .plain} |
| 38 | ::: |
| ::: | |
| | ::: {.line .number33 .index32 .alt2} |
| ::: {.line .number39 .index38 .alt2} |
{.csharp .spaces}if
{.csharp |
| 39 | .keyword} (indexArray[lastIndex] < array[lastIndex].Length - 1)
{.csharp |
| ::: | .plain} |
| | ::: |
| ::: {.line .number40 .index39 .alt1} | |
| 40 | ::: {.line .number34 .index33 .alt1} |
| ::: |
{.csharp .spaces}{
{.csharp .plain} |
| | ::: |
| ::: {.line .number41 .index40 .alt2} | |
| 41 | ::: {.line .number35 .index34 .alt2} |
| ::: |
{.csharp .spaces}indexArray[lastIndex]++;
{.csharp .plain} |
| | ::: |
| ::: {.line .number42 .index41 .alt1} | |
| 42 | ::: {.line .number36 .index35 .alt1} |
| ::: |
{.csharp .spaces}continue
{.csharp .keyword};
{.csharp |
| | .plain}//本级增长成功,继续循环
{.csharp .comments} |
| ::: {.line .number43 .index42 .alt2} | ::: |
| 43 | |
| ::: | ::: {.line .number37 .index36 .alt2} |
| |
{.csharp .spaces}}
{.csharp .plain} |
| ::: {.line .number44 .index43 .alt1} | ::: |
| 44 | |
| ::: | ::: {.line .number38 .index37 .alt1} |
| |
{.csharp .spaces} |
| ::: {.line .number45 .index44 .alt2} | ::: |
| 45 | |
| ::: | ::: {.line .number39 .index38 .alt2} |
| |
{.csharp .spaces}//如果本级增长到最大,则向上递增
{.csharp |
| ::: {.line .number46 .index45 .alt1} | .comments} |
| 46 | ::: |
| ::: | |
| | ::: {.line .number40 .index39 .alt1} |
| ::: {.line .number47 .index46 .alt2} |
{.csharp .spaces}while
{.csharp |
| 47 | .keyword} (lastIndex > 0)
{.csharp .plain} |
| ::: | ::: |
| | |
| ::: {.line .number48 .index47 .alt1} | ::: {.line .number41 .index40 .alt2} |
| 48 |
{.csharp .spaces}{
{.csharp .plain} |
| ::: | ::: |
| | |
| ::: {.line .number49 .index48 .alt2} | ::: {.line .number42 .index41 .alt1} |
| 49 |
{.csharp .spaces}pointer++;
{.csharp .plain} |
| ::: | ::: |
| | |
| ::: {.line .number50 .index49 .alt1} | ::: {.line .number43 .index42 .alt2} |
| 50 |
{.csharp |
| ::: | .spaces}lastIndex = array.Length - 1 - pointer;
{.csharp .plain} |
| | ::: |
| ::: {.line .number51 .index50 .alt2} | |
| 51 | ::: {.line .number44 .index43 .alt1} |
| ::: |
{.csharp .spaces}//递增成功
{.csharp .comments} |
| | ::: |
| ::: {.line .number52 .index51 .alt1} | |
| 52 | ::: {.line .number45 .index44 .alt2} |
| ::: |
{.csharp .spaces}if
{.csharp |
| | .keyword} (indexArray[lastIndex] < array[lastIndex].Length - 1)
{.csharp |
| ::: {.line .number53 .index52 .alt2} | .plain} |
| 53 | ::: |
| ::: | |
| | ::: {.line .number46 .index45 .alt1} |
| ::: {.line .number54 .index53 .alt1} |
{.csharp .spaces}{
{.csharp .plain} |
| 54 | ::: |
| ::: | |
| | ::: {.line .number47 .index46 .alt2} |
| ::: {.line .number55 .index54 .alt2} |
{.csharp .spaces}indexArray[lastIndex]++;
{.csharp |
| 55 | .plain} |
| ::: | ::: |
| | |
| ::: {.line .number56 .index55 .alt1} | ::: {.line .number48 .index47 .alt1} |
| 56 |
{.csharp .spaces}for
{.csharp .keyword} (
{.csharp |
| ::: | .plain}int
{.csharp |
| | .keyword} i = lastIndex + 1; i < array.Length; i++)
{.csharp .plain} |
| ::: {.line .number57 .index56 .alt2} | ::: |
| 57 | |
| ::: | ::: {.line .number49 .index48 .alt2} |
| |
{.csharp .spaces}{
{.csharp .plain} |
| ::: {.line .number58 .index57 .alt1} | ::: |
| 58 | |
| ::: | ::: {.line .number50 .index49 .alt1} |
| |
{.csharp .spaces}indexArray[i] = 0;
{.csharp |
| ::: {.line .number59 .index58 .alt2} | .plain} |
| 59 | ::: |
| ::: | |
| | ::: {.line .number51 .index50 .alt2} |
| |
{.csharp .spaces}}
{.csharp .plain} |
| | ::: |
| | |
| | ::: {.line .number52 .index51 .alt1} |
| |
{.csharp .spaces}pointer = 0;
{.csharp .plain} |
| | ::: |
| | |
| | ::: {.line .number53 .index52 .alt2} |
| |
{.csharp .spaces}break
{.csharp .keyword};
{.csharp |
| | .plain} |
| | ::: |
| | |
| | ::: {.line .number54 .index53 .alt1} |
| |
{.csharp .spaces}}
{.csharp .plain} |
| | ::: |
| | |
| | ::: {.line .number55 .index54 .alt2} |
| |
{.csharp .spaces}}
{.csharp .plain} |
| | ::: |
| | |
| | ::: {.line .number56 .index55 .alt1} |
| |
{.csharp .spaces}}
{.csharp .plain} |
| | ::: |
| | |
| | ::: {.line .number57 .index56 .alt2} |
| |
{.csharp .spaces} |
| | ::: |
| | |
| | ::: {.line .number58 .index57 .alt1} |
| |
{.csharp .spaces}return
{.csharp .keyword} result;
{.csharp |
| | .plain} |
| | ::: |
| | |
| | ::: {.line .number59 .index58 .alt2} |
| | }
{.csharp .plain} |
| | ::: |
| | :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
+--------------------------------------+----------------------------------------------------------------------------+
::::
\
演示代码:string[][] array = { new string[] { "张三", "李四", }, new string[] { "打", "拿", "亲" }, new string[] { "鱼", "猫", "美女" } };
结果:
- 张三打鱼
- 张三打猫
- 张三打美女
- 张三拿鱼
- 张三拿猫
- 张三拿美女
- 张三亲鱼
- 张三亲猫
- 张三亲美女
- 李四打鱼
- 李四打猫
- 李四打美女
- 李四拿鱼
- 李四拿猫
- 李四拿美女
- 李四亲鱼
- 李四亲猫
- 李四亲美女
作者:翅膀的初衷 出处:http://www.jiniannet.com