2016-06-23 6 views
2

配列宣言のように、寸法の可能性をすべて印刷する方法はありますか?例えば寸法のすべての可能性を印刷する

[2, 2] 

は与える:

[0,0] [0,1] [0,2] [1,0] [1,1] [1,2] [2,0] [2,1] [2,2] 

私はそれがすべての次元(1D、2D、3D、4D ...)

答えて

4

私はが可能すべての項目を生成示唆

private static IEnumerable<String> Ranges(params int[] ranges) { 
    int[] current = new int[ranges.Length]; 

    bool hasItems = true; 

    yield return String.Format("[{0}]", String.Join(",", current)); 

    while (hasItems) { 
    hasItems = false; 

    for (int i = 0; i < current.Length; ++i) { 
     if (current[i] < ranges[i]) { 
     hasItems = true; 

     current[i] = current[i] + 1; 

     for (int j = i - 1; j >= 0; --j) 
      current[j] = 0; 

     yield return String.Format("[{0}]", String.Join(",", current)); 

     break; 
     } 
    } 
    } 
} 

あなたのサンプル:

int[] source = new int[] { 2, 2 }; 

// [0,0] [1,0] [2,0] [0,1] [1,1] [2,1] [0,2] [1,2] [2,2] 
Console.Write(String.Join(" ", Ranges(source))); 

別のテスト(3次元)

int[] source = new int[] { 2, 1, 3}; 

    // [0,0,0] [1,0,0] [2,0,0] [0,1,0] [1,1,0] [2,1,0] [0,0,1] [1,0,1] [2,0,1] [0,1,1] 
    // [1,1,1] [2,1,1] [0,0,2] [1,0,2] [2,0,2] [0,1,2] [1,1,2] [2,1,2] [0,0,3] [1,0,3] 
    // [2,0,3] [0,1,3] [1,1,3] [2,1,3] 
    Console.Write(String.Join(" ", Ranges(source))); 

編集:あなたが仕事をしたい場合実際の多次元配列では、Linqを使用してディメンションの配列:

// d is 3D array 
    // please, notice, that type of the array (string) doesn't play any role 
    string[,,] d = new string[2, 3, 1]; 

    // array of dimensions: int[] {2, 3, 1} 
    int[] dims = Enumerable 
    .Range(0, d.Rank) 
    .Select(dim => d.GetLength(dim)) 
    .ToArray(); 

    Console.Write(String.Join(" ", Ranges(dims))); 
+2

107MPをご存じですか?これを使用すると、インストラクターは自分で書いたことがないことを確実に知ることができます。 –

+0

ありがとう、私は解決策を求めていませんでした。しかし、私はそれをするのは難しいだろうが。私はあなたの努力に感謝します。 – 107MP

+0

宿題ではない@BradleyUffner; – 107MP

1

することができますのために働きたいです

void IndexPermutations(int range1, int range2) 
{ 
    for(int i=0; i<range1; i++) 
    { 
    for(int j=0; j<range2; j++) 
    { 
    Console.WriteLine("[{0},{1}]",i,j); 
    } 
    } 
} 
+0

これは一次元だけです... –

+2

だから私たちは彼の宿題全体をしなければなりませんか? –

+3

いいえ、私たちにはありません –

1

再帰的ソリューションを使用できます。

public void IndexPermutations(int dimensionSize, int minValue, int maxValue, Action<List<int>> action) 
{ 
    IndexPermutationsInternal(dimensionSize, minValue, maxValue, action, new List<int>()); 
} 

private void IndexPermutationsInternal(
    int dimensionSize, 
    int minValue, 
    int maxValue, 
    Action<List<int>> action, 
    List<int> current) 
{ 
    if (dimensionSize == current.Count) 
    { 
     action(current); 
    } 
    else 
    { 
     for (int i = minValue; i <= maxValue; i++) 
     { 
      current.Add(i); 
      IndexPermutationsInternal(dimensionSize, minValue, maxValue, action, current); 
      current.RemoveAt(current.Count - 1); 
     } 
    } 
} 
2

少々IEnumerableマジック!

public static IEnumerable<IEnumerable<int>> GetCombinations(IEnumerable<int> dimensions) 
    { 
     if (!dimensions.Any()) 
     { 
      yield return Enumerable.Empty<int>(); 
      yield break; 
     } 

     var first = dimensions.First(); 

     foreach (var subSolution in GetCombinations(dimensions.Skip(1))) 
     { 
      for (var i = 0; i < first + 1; i++) 
      { 
       yield return new[] { i }.Concat(subSolution); 
      } 
     } 
    } 
2

任意の多次元配列から動的にインデックス出力を生成する単純なソリューション:

[0,0,0] [1,0,0] [2,0,0] [3,0,0] [0,1,0] [1,1,0] [2,1,0] [3,1,0] 
[0,2,0] [1,2,0] [2,2,0] [3,2,0] [0,0,1] [1,0,1] [2,0,1] [3,0,1] 
[0,1,1] [1,1,1] [2,1,1] [3,1,1] [0,2,1] [1,2,1] [2,2,1] [3,2,1] 
[0,0,2] [1,0,2] [2,0,2] [3,0,2] [0,1,2] [1,1,2] [2,1,2] [3,1,2] 
[0,2,2] [1,2,2] [2,2,2] [3,2,2] [0,0,3] [1,0,3] [2,0,3] [3,0,3] 
[0,1,3] [1,1,3] [2,1,3] [3,1,3] [0,2,3] [1,2,3] [2,2,3] [3,2,3] 
:任意の3Dアレイ int[,,] arr = new int[3,2,3]を使用

[0,0] [1,0] [2,0] [0,1] [1,1] [2,1] [0,2] [1,2] [2,2] 

:あなたのサンプルint[,] arr = new int[2,2]を使用

static void Main(string[] args) 
{ 
    int[,] arr = new int[2, 2]; 
    // int[,,] arr = new int[3, 2, 3]; 
    printArrayIndexes(arr); 
} 

private static void printArrayIndexes(object arr) 
{ 
    var dimensArr = arr as Array; 
    List<int> indexList = new List<int>(); 
    for (int dimension = 0; dimension < dimensArr.Rank; dimension++) 
    { 
     indexList.Add(0); 
    } 
    bool hasItems = true; 
    while (hasItems) 
    { 
     hasItems = false; 
     Console.WriteLine(String.Format("[{0}]", String.Join(",", indexList))); 
     for (int i = 0; i < indexList.Count; i++) 
     { 
      if (indexList[i] < dimensArr.GetLength(i)) { 
       hasItems = true; 
       indexList[i]++; 
       break; 
      } else { 
       indexList[i] = 0; 
      } 
     } 
    } 
} 

1D、2D、3D、4Dの配列を使用することができます...

関連する問題