2017-07-03 6 views
0

私はを使って得ることができるmultidimensional arrayを使用して出力を達成しようとしています。どのように多次元配列で望ましい結果を達成するには? C#

入力:

var foodPair = new Dictionary<string, string> 
{ 
    {"Pizza", "Italian"}, 
    {"Curry", "Indian"}, 
    {"Masala", "Indian"} 
}; 

var teamPreference = new Dictionary<string, string> 
{ 
    {"Jose", "Italian" }, 
    {"John", "Indian" }, 
    {"Sarah", "Thai" }, 
    {"Mary", "*" } 
}; 

* means give everything 
If selected food type is not available than give nothing. i.e Thai 

出力:

Jose, Pizza 
John, Curry 
John, Masala 
Mary, Pizza 
Mary, Curry 
Mary, Masala 

ワーキングKeyValuePair<string, string>を使用して結果:

https://dotnetfiddle.net/hNdlfy

を「私はstring[,]を使用して同じ結果を達成したいが、私はドンダイムに挿入する方法を知らないnsional配列。基本的に私はこの種の例を実行することによってmultidimensional arraysがどのように動作するかを学んでいます。

+0

何もありません。ディクショナリを使用しているときは、KeyPairValueであり、キーはルックアップを高速化するためのハッシュです。 List >を使用することもできます。データを格納するときの辞書は、追加辞書がキーをハッシュテーブルに入れなければならないので、リスト<>に追加するよりも時間がかかります。したがって、データを取得するためにハッシュを必要としない場合や、書き込み速度を上げたい場合は、辞書の代わりにリストを使用することはできません。 – jdweng

答えて

0

任意の配列(1次元または多次元)に「挿入」することはできません。しかし、十分なスペースを持つ配列を作成することができます。

var foodPair = new Dictionary<string, string> { { "Pizza", "Italian" }, { "Curry", "Indian" }, { "Masala", "Indian" } }; 
    var teamPreference = new Dictionary<string, string> { { "Jose", "Italian" }, { "John", "Indian" }, { "Sarah", "Thai" }, { "Mary", "*" } }; 
    var results = new List<KeyValuePair<string, string>>(); 

    var results2 = new string[10, 2]; 
    int rowIndex = 0; 

    foreach (var teamMember in teamPreference) 
    { 
     switch (teamMember.Key) 
     { 
      case "Jose": 
       var key = foodPair.FirstOrDefault(x => x.Value == "Italian").Key; 
       results.Add(new KeyValuePair<string, string>(teamMember.Key, key)); 
       results2[rowIndex, 0] = teamMember.Key; 
       results2[rowIndex, 1] = key; 
       rowIndex++; 
       break; 

      case "John": 
       var getAll = foodPair.Where(x => x.Value == "Indian").ToList(); 
       if (getAll.Any()) 
       { 
        results.AddRange(getAll.Select(a => new KeyValuePair<string, string>(teamMember.Key, a.Key))); 
       } 
       foreach (var item in getAll) 
       { 
        results2[rowIndex, 0] = teamMember.Key; 
        results2[rowIndex, 1] = item.Key; 
        rowIndex++; 
       } 
       break; 

      case "Sarah": 
       var c = foodPair.FirstOrDefault(x => x.Value == "Thai").Key; 
       if (!string.IsNullOrEmpty(c)) 
       { 
        results.Add(new KeyValuePair<string, string>(teamMember.Key, c)); 
       } 
       if (!string.IsNullOrEmpty(c)) 
       { 
        results2[rowIndex, 0] = teamMember.Key; 
        results2[rowIndex, 1] = c; 
        rowIndex++; 
       } 

       break; 

      case "Mary": 
       if (teamMember.Value == "*") 
       { 
        var everything = foodPair.Keys.ToList(); 
        if (everything.Any()) 
        { 
         results.AddRange(everything.Select(food => new KeyValuePair<string, string>(teamMember.Key, food))); 
        } 
        foreach (var item in everything) 
        { 
         results2[rowIndex, 0] = teamMember.Key; 
         results2[rowIndex, 1] = item; 
         rowIndex++; 
        } 
       } 

       break; 
     } 
    } 

    if (results.Any()) 
    { 
     foreach (var result in results) 
     { 
      Console.WriteLine("{0}, {1}", result.Key, result.Value); 
     } 
    } 

    Console.WriteLine("Using multidimensional array"); 

    for (int row = 0; row < rowIndex; row++) 
    { 
     Console.WriteLine("{0}, {1}", results2[row, 0], results2[row, 1]); 
    } 

しかし、多次元配列はこのタスクの適切なデータ構造ではありません。 (あなたはひどいアレイのコードを見ることができます)。必要なデータ構造はtupleとなり、結果の定義はvar results3 = new List<Tuple<string, string>>();
のようになります。.Any()foreachという文を使用する必要はありません。 foreachは、空のコレクションに対しては実行されません。
C#の学習で幸運を祈る!

0

私は、所望の結果を達成するためにExtensionの方法を使用した。

public static string[,] FoodPreferenceWithDimensionalArray() 
{ 
    var foodPair = new Dictionary<string, string> 
    { 
     {"Pizza", "Italian"}, 
     {"Curry", "Indian"}, 
     {"Masala", "Indian"} 
    }; 

    var teamPreference = new Dictionary<string, string> 
    { 
     {"Jose", "Italian" }, 
     {"John", "Indian" }, 
     {"Sarah", "Thai" }, 
     {"Mary", "*" } 
    }; 

    var results = new List<KeyValuePair<string, string>>(); 
    foreach (var teamMember in teamPreference) 
    { 
     switch (teamMember.Key) 
     { 
      case "Jose": 
       var italianDish = foodPair.FirstOrDefault(x => x.Value == "Italian").Key; 
       results.Add(new KeyValuePair<string, string>(teamMember.Key, italianDish)); 
       break; 

      case "John": 
       var indianDish = foodPair.Where(x => x.Value == "Indian"); 
       if (indianDish.Any()) 
       { 
        results.AddRange(indianDish.Select(dish => new KeyValuePair<string, string>(teamMember.Key, dish.Key))); 
       } 
       break; 

      case "Sarah": 
       var thaiDish = foodPair.FirstOrDefault(x => x.Value == "Thai").Key; 
       if (!string.IsNullOrEmpty(thaiDish)) 
       { 
        results.Add(new KeyValuePair<string, string>(teamMember.Key, thaiDish)); 
       } 
       break; 

      case "Mary": 
       if (teamMember.Value == "*") 
       { 
        var everything = foodPair.Keys.ToList(); 
        if (everything.Any()) 
        { 
         results.AddRange(everything.Select(food => new KeyValuePair<string, string>(teamMember.Key, food))); 
        } 
       } 
       break; 
     } 
    } 

    var resultIn2DArray = results.To2DArray(); 
    return resultIn2DArray; 
} 

// Created extension to convert List to String[,] 
public static class Extension 
{ 
    public static string[,] To2DArray<T>(this List<T> list) 
    { 
     if (list.Count == 0) 
     { 
      throw new ArgumentException("The list must have non-zero dimensions."); 
     } 

     var result = new string[list.Count, list.Count]; 
     for (var i = 0; i < list.Count; i++) 
     { 
      // This is set to 0 since I know the output but will work on this to make it dynamic. 
      result[0, i] = list[i].ToString(); 
     } 

     return result; 
    } 
} 

ありがとうございます。

関連する問題