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