c#遍历二维数组(或交错数组)的所有组合

作者:翅膀的初衷 来源:本站原创 发布时间:2014-03-28 查看数:64326

遍历多维数组或者交错数组是很件很容易的事,用一个递归就可以了,但是要获取它的所有组合,相对来说就要麻烦很多,正好前面笔者就用到了类似的需求,便随手写了一个,分享一下(此处以交错数组为例,二维数组一样的,略略改动即可):

\

:::: {#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