2016-10-26 1 views
0

Ich habe ein Wörterbuch [mapData] wie unten und überprüfen Schlüssel ein [Dictionary< string, DateTime >] existiert in [mapData] ist, aber es hat nicht funktioniert:Wie überprüft man, ob der Schlüssel in einem Wörterbuch existiert, wenn der Schlüssel selbst ein Wörterbuch (C#) ist?

 var mapData = new Dictionary<Dictionary<string, DateTime>, List<Student>>(); 

     foreach (var st in listStudent) 
     { 
      // Create Key 
      var dicKey = new Dictionary<string, DateTime>(); 
      dicKey.Add(st.Name, st.Birthday); 

      // Get mapData 
      if (!mapData.ContainsKey(dicKey))  // ===> Can not check key exists 
      { 
       mapData.Add(dicKey, new List<Student>()); 
      } 
      mapData[dicKey].Add(st); 
     } 

ich mit der Erweiterung Methode als unten versucht, aber auch nicht:

 public static bool Contains<Tkey>(this Dictionary<Tkey, List<Student>> dic, Tkey key) 
     { 
      if (dic.ContainsKey(key)) 
       return true; 
      return false; 
     } 

Alle Tipps zu diesen werden große Hilfe sein. Danke im Voraus.

+2

"es nicht funktioniert" nicht sagen uns nichts über das, was du gesehen hast. Es klingt, als ob die Verwendung eines Wörterbuchs hier eine schlechte Wahl ist - es ist sicherlich eine sehr seltsame Schlüsselwahl. Was erwarten Sie in diesem Wörterbuch außer dem Namen und dem Geburtstag des Schülers? –

Antwort

2

Dies ist, weil Sie versuchen, den Schlüssel basierend auf Objektreferenz nicht den Schlüsselinhalt zu finden. Ihr Wörterbuchschlüssel ist eine Kombination aus Schlüssel + Wert Referenz.

dies nicht funktionieren, wenn Sie neu zu schreiben und IEqualityComparer.

var objectA = new ObjectA(); 
var objectB = new ObjectA(); 

objectA != objectB es sei denn rewritte Sie die Gleichen.

EDIT

Diese Probe von MSDN comming ist https://msdn.microsoft.com/en-us/library/ms132151(v=vs.110).aspx

using System; 
using System.Collections.Generic; 

class Example 
{ 
    static void Main() 
    { 
     BoxEqualityComparer boxEqC = new BoxEqualityComparer(); 

     var boxes = new Dictionary<Box, string>(boxEqC); 

     var redBox = new Box(4, 3, 4); 
     AddBox(boxes, redBox, "red"); 

     var blueBox = new Box(4, 3, 4); 
     AddBox(boxes, blueBox, "blue"); 

     var greenBox = new Box(3, 4, 3); 
     AddBox(boxes, greenBox, "green"); 
     Console.WriteLine(); 

     Console.WriteLine("The dictionary contains {0} Box objects.", 
         boxes.Count); 
    } 

    private static void AddBox(Dictionary<Box, String> dict, Box box, String name) 
    { 
     try { 
     dict.Add(box, name); 
     } 
     catch (ArgumentException e) { 
     Console.WriteLine("Unable to add {0}: {1}", box, e.Message); 
     } 
    } 
} 

public class Box 
{ 
    public Box(int h, int l, int w) 
    { 
     this.Height = h; 
     this.Length = l; 
     this.Width = w; 
    } 

    public int Height { get; set; } 
    public int Length { get; set; } 
    public int Width { get; set; } 

    public override String ToString() 
    { 
     return String.Format("({0}, {1}, {2})", Height, Length, Width); 
    } 
} 


class BoxEqualityComparer : IEqualityComparer<Box> 
{ 
    public bool Equals(Box b1, Box b2) 
    { 
     if (b2 == null && b1 == null) 
      return true; 
     else if (b1 == null | b2 == null) 
      return false; 
     else if(b1.Height == b2.Height && b1.Length == b2.Length 
          && b1.Width == b2.Width) 
      return true; 
     else 
      return false; 
    } 

    public int GetHashCode(Box bx) 
    { 
     int hCode = bx.Height^bx.Length^bx.Width; 
     return hCode.GetHashCode(); 
    } 
} 
// The example displays the following output: 
// Unable to add (4, 3, 4): An item with the same key has already been added. 
// 
// The dictionary contains 2 Box objects. 
2

Sie wollen nicht dorthin gehen. Komplexe Objekte sind nicht als Schlüssel in einem Wörterbuch gedacht. Ich würde vorschlagen, das Wörterbuch auf den Wert zu verschieben und eine baumähnlichere Struktur zu erstellen.

Es gibt eine Möglichkeit, das funktioniert, aber ich würde aus den oben genannten Gründen dagegen raten: die Implementierung eines benutzerdefinierten IEqualityComparer, die die Schlüssel im Wörterbuch gegen ein anderes Wörterbuch vergleicht.

Verwandte Themen