2009-06-11 16 views
21

Puede alguien señalar a algunos ejemplos de código C# o proporcionar algo de código, donde un diccionario se ha utilizado como una propiedad de una clase.Diccionario .NET como una propiedad

Los ejemplos que he visto hasta ahora no cubren todos los aspectos a saber cómo declarar el diccionario como propiedad, añadir, eliminar y recuperar los elementos del diccionario.

Respuesta

32

Aquí está un ejemplo rápido

class Example { 
    private Dictionary<int,string> _map; 
    public Dictionary<int,string> Map { get { return _map; } } 
    public Example() { _map = new Dictionary<int,string>(); } 
} 

Algunos casos de uso

var e = new Example(); 
e.Map[42] = "The Answer"; 
+0

Sí a la derecha "42" es la "respuesta a la última pregunta de la vida, el universo, y todo". – Equiman

16

de ejemplo: el uso

public class MyClass 
{ 
    public MyClass() 
    { 
    TheDictionary = new Dictionary<int, string>(); 
    } 

    // private setter so no-one can change the dictionary itself 
    // so create it in the constructor 
    public IDictionary<int, string> TheDictionary { get; private set; } 
} 

muestra:

MyClass mc = new MyClass(); 

mc.TheDictionary.Add(1, "one"); 
mc.TheDictionary.Add(2, "two"); 
mc.TheDictionary.Add(3, "three"); 

Console.WriteLine(mc.TheDictionary[2]); 
+4

yo consideraría la exposición de la propiedad como IDictionary en lugar de toda la clase. –

+0

bien, cambia la propiedad –

1

Un ejemplo ...

public class Example 
{ 
    public Dictionary<Int32, String> DictionaryProperty 
    { 
     get; set; 
    } 

    public Example() 
    { 
     DictionaryProperty = new Dictionary<int, string>(); 
    } 
} 

public class MainForm 
{ 
    public MainForm() 
    { 
     Example e = new Example(); 

     e.DictionaryProperty.Add(1, "Hello"); 
     e.DictionaryProperty.Remove(1); 
    } 
} 
10

También podría mirar en indexers. (Documentación de MSDN oficial here)

class MyClass 
{ 
    private Dictionary<string, string> data = new Dictionary<string, string>(); 

    public MyClass() 
    { 
     data.Add("Turing, Alan", "Alan Mathison Turing, OBE, FRS (pronounced /ˈtjʊ(ə)rɪŋ/) (23 June, 1912 – 7 June, 1954) was a British mathematician, logician, cryptanalyst and computer scientist.") 
     //Courtesy of [Wikipedia][3]. Used without permission 
    } 

    public string this [string index] 
    { 
     get 
     { 
      return data[index]; 
     } 
    } 
} 

Entonces, una vez que han poblado el diccionario internamente, puede acceder a su información por ir

MyClass myExample = new MyClass(); 

string turingBio = myExample["Turing, Alan"]; 

EDITAR

Obviamente, esto tiene que ser usado con cuidado, porque MyClass NO es un diccionario, y no puede usar ningún método de diccionario en él a menos que los implemente para la clase contenedora. Pero los indexadores son una gran herramienta en ciertas situaciones.

2

Otro ejemplo del uso de un diccionario como una propiedad estática con sólo el acceso get:

private static Dictionary <string, string> dict = new Dictionary <string,string>(){    
      {"Design Matrix", "Design Case"}, 
      {"N/A", "Other"} 
    }; 


    public static Dictionary <string, string> Dict 
    { 
     get { return dict} 
    }   

Esta estructura se puede utilizar para sustituir los valores.

4

Para asegurarse de que la encapsulación es correcta y el diccionario no se puede actualizar fuera de la clase usando Agregar o el formulario EjemploDiccionario [1] = "prueba", use IReadOnlyDictionary.

public class Example 
{ 
    private Dictionary<int, string> exampleDictionary; 

    public Example() 
    { 
     exampleDictionary = new Dictionary<int, string>(); 
    } 

    public IReadOnlyDictionary<int, string> ExampleDictionary 
    { 
     get { return (IReadOnlyDictionary<int, string>)exampleDictionary; } 
    } 
} 

El siguiente código no funcionará, lo cual no es el caso si se utiliza IDictionary:

var example = new Example(); 
example.ExampleDictionary[1] = test; 
+0

Sé que el OP (tipo de) dejó claro que quería que la propiedad de tener la funcionalidad de IDictionary, pero yo no estaba al tanto de IReadOnlyDictionary y lo necesitaba.+1 –

+0

Un simple elenco a 'IReadOnlyDictionary' no es suficiente si realmente desea evitar la modificación del contenido del diccionario, un simple retorno a Dictionary permitirá modificarlo. Debe envolver el diccionario en ReadOnlyDictionary y devolver el contenedor. – marapet

Cuestiones relacionadas