2016-05-15 4 views
0

私は多次元配列があります。C#多次元配列に値とインデックスがあるかどうかを確認するにはどうすればよいですか?

string[,] array = new string[,] 
    { 
     {"cat", "dog", "plane"}, 
     {"bird", "fish", "elephant"}, 
    }; 

を、私はそれが価値が含まれているかどうかを確認したい、とそう、私はそれのインデックスを必要とする場合、のは「鳥」のために、と言ってみましょう。私は必要なもの

はそれが含まれている場合、検索

  • です。
  • は、それのインデックスを取得します。
  • 、第2の次元の長さを取得します(私はそれを呼び出して方法がわからない)とその次元の最後に2つ目の要素からランダムな値を返します。

私が「鳥」と言うと、「魚」と「象」の間にランダムな文字列を与えたいと思っています。 それは通常の配列だった場合、私はシンプル

random.Next(1, array.Length); 

になるだろう。しかし、私は2次元配列でそれを作る方法がわかりません。

ありがとうございます!

+0

一番左の列を検索して一致していることを確認してから、残りの列からランダムな値を生成することはできますか?または、どの列にも一致することができますか? – Enigmativity

答えて

2

多次元配列の1次元の長さを取得するには、array.Lengthの代わりにarray.GetLength()を使用する必要があります。アレイを通して

反復。あなたが一致を見つけた場合、現在のインデックスを格納し、array.GetLengthRandomクラスを使用して、一致する行からランダムな値をつかみます。

Random rnd = new Random(); 

int index = -1; 
string randomWord = ""; 

for(int i = 0; i < array.GetLength(0); i++) 
{ 
    if (array[i,0] == "bird") 
    { 
     index = i; 
     randomWord = array[i,rnd.Next(1, array.GetLength(1))]; 
     break; 
    } 
} 
+0

これは正しいものです!ありがとう! –

+0

@Javierようこそ。 –

1

List<list<string>>は、操作が簡単です。

私はリストに巣にそれをこれを行うだろう、あなたの元のデータで始める場合:

List<List<string>> nested = 
    array 
     .OfType<string>() 
     .Select((x, i) => new { x, i }) 
     .GroupBy(x => x.i/array.GetLength(1), x => x.x) 
     .Select(x => x.ToList()) 
     .ToList(); 

今、私はこの関数を記述することができます。getRandom("bird")でそれを呼び出す

var random = new Random(); 
Func<string, string> getRandom = x => 
(
    from row in nested 
    where row[0] == x 
    from choice in row.Skip(1).OrderBy(y => random.Next()) 
    select choice 
).FirstOrDefault(); 

が正しく私を提供します"fish"または"elephant"のいずれかです。

+0

それは働いた。ありがとう! –

1

は、ここでは、多次元配列で何をしたいことの一例です。コメントであなたが対処する必要がありますエッジケースがあることに注意してください。

ここ
using System; 

class Program 
{ 
    static string[,] array = new string[,] 
    { 
     { "cat", "dog", "plane" }, 
     { "bird", "fish", "elephant" }, 
    }; 

    static int FindRow(string elem) 
    { 
     int rowCount = array.GetLength(0), 
      colCount = array.GetLength(1); 
     for (int rowIndex = 0; rowIndex < rowCount; rowIndex++) 
     { 
      for (int colIndex = 0; colIndex < colCount; colIndex++) 
      { 
       if (array[rowIndex, colIndex] == elem) 
       { 
        return rowIndex; 
       } 
      } 
     } 
     return -1; 
    } 

    static string PickRandomTail(int rowIndex) 
    { 
     int colCount = array.GetLength(1); 
     int randColIndex = new Random().Next(1, colCount); 
     return array[rowIndex, randColIndex]; 
    } 

    static void Main() 
    { 
     int rowIndex = FindRow("bird"); 
     if (rowIndex < 0) 
     { 
      // handle the element is not found 
     } 
     Console.WriteLine(PickRandomTail(rowIndex)); 
    } 
} 
-1

あなたのデータ構造を壊すことなく例:

static int IndexOf<T>(T[,] array, T toFind) 
    { 
     int i = -1; 
     foreach (T item in array) 
     { 
      ++i; 
      if (toFind.Equals(item)) 
       break ; 
     } 
     return i; 
    } 

    static string GetRandomString(string[,] array, string toFind) 
    { 
     int lineLengh = array.Length/array.Rank; 
     int index = IndexOf(array, toFind); 
     int lineIndex = index/lineLengh; 

     Random random = new Random(); 
     index = random.Next(lineIndex * lineLengh + 1, (lineIndex + 1) * lineLengh); 
     return array[lineIndex, index % lineLengh]; 
    } 

    // If you want to get a random element between the index and the end of the line 
    // You can replace "bird" by any word you want, 
    // except a word at the end of a line (it will return you the first element of the next line) 
    // static string GetRandomString(string[,] array, string toFind) 
    // { 
    //  int lineLengh = array.Length/array.Rank; 
    //  int index = IndexOf(array, toFind); 

    //  Random random = new Random(); 
    //  index = random.Next(index + 1, (index/lineLengh + 1) * lineLengh); 
    //  return array[index/lineLengh, index % lineLengh]; 
    // } 

    static void Main(string[] args) 
    { 
     string[,] array = new string[,] 
     { 
      {"cat", "dog", "plane"}, 
      {"bird", "fish", "elephant"}, 
     }; 
     Console.WriteLine(GetRandomString(array, "bird")); 
     Console.ReadKey(); 
    } 

完璧なものにするには、インデックスがない場合はチェックを追加する必要があり-1、あなたが範囲から乱数を得ることができる場合索引と行の終わりの間。


多次元配列に異なるサイズの行を含めることができる場合は、string [] []も使用する必要があります。 [、]列で、あなたの配列は、同じサイズの行を含める必要があります。

関連する問題