2012-07-20 9 views
15

Jak zdefiniować procedurę pobierającą i ustawiającą dla złożonych typów danych, takich jak słownik?Jak napisać narzędzie pobierające i ustawiające dla słownika?

public Dictionary<string, string> Users 
{ 
    get 
    { 
     return m_Users; 
    } 

    set 
    { 
     m_Users = value; 
    } 
} 

Powoduje zwrócenie całego słownika? Czy możesz napisać settera, aby zobaczyć i zobaczyć, czy istnieje określona para klucz-wartość, a następnie, jeśli nie, dodaj ją. Else zaktualizować bieżącą parę wartości klucza? Aby uzyskać, czy możesz zwrócić określoną parę klucz-wartość zamiast całego słownika?

+2

użytkowania własności podziałowe. Zobacz http://msdn.microsoft.com/en-us/library/aa288464(VS.71).aspx –

+0

Dzięki za odpowiedzi. Teraz znam opcje, które mam. Wolę tworzyć metody get i set, niż używać indeksu. – Mausimo

Odpowiedz

16

Nie można tego zrobić w sposób, który dotyczyłby tylko nieruchomości. You teoretycznie może napisać setter, ale dla gettera, musisz określić klucz, który chcesz odzyskać. Jest to niemożliwe, ponieważ właściwości nie akceptują parametrów. Naturalne drogą do osiągnięcia tego, co chcesz byłoby użyć metody:

private Dictionary<string, string> users = new Dictionary<string, string>(); 

public void Set(string key, string value) 
{ 
    if (users.ContainsKey(key)) 
    { 
     users[key] = value; 
    } 
    else 
    { 
     users.Add(key, value); 
    } 
} 

public string Get(string key) 
{ 
    string result = null; 

    if (users.ContainsKey(key)) 
    { 
     result = users[key]; 
    } 

    return result; 
} 

Alternatywnie, jak inni już powiedział, można użyć indeksujących, ale zawsze znaleźć im trochę kłopotliwe. Ale myślę, że to tylko kwestia osobistych preferencji.

I właśnie ze względu na kompletność, to jak seter może wyglądać, chociaż jest to bardzo nietypowe i intuicyjne mieć taką właściwość:

public KeyValuePair<string, string> Users 
{ 
    set 
    { 
     Set(value.Key, value.Value); 
    } 
} 

Wewnętrznie wykorzystuje metodę z Set mój poprzedni fragment.

+2

Warto zauważyć, że technicznie można użyć właściwości do ustawienia wartości (wystarczy mieć właściwość typu "keyvaluepair"). Po prostu nie można użyć 'get'ter, aby uzyskać wartość (lub parę) dla klucza, ponieważ nie można podać klucza. – Servy

+0

Może użyć właściwości indeksu, nie potrzebuje metody, per se ... –

+0

@Servy Oczywiście, * technicznie *, możesz, ale byłoby to całkiem nienaturalne. –

1

Nie można tego zrobić za pomocą nieruchomości. Musisz użyć metod do tego lub dodać indeks do swojej klasy. Metoda get nie może przyjąć parametru (klucz).

Inną opcją, jeśli chcesz, aby ktoś mógł łatwo dodawać/usuwać klucze do słownika, ale uniemożliwić im ustawienie zupełnie nowego, byłoby uczynienie z tej właściwości tylko do odczytu właściwości, która zwraca słownik utworzony w konstruktor. Byłoby mniej elastyczne niż dodawanie metod pobierania/ustawiania, ale w zwykłych, prostych przypadkach może to zrobić dobrze.

+1

Indeksowanie +1 jest prawdopodobnie tym, czego chce –

+0

Są sposoby na robienie tego, co chce. Po prostu nie bezpośrednio. – Ani

0

Wygląda na to, że chcesz "nazwany indeksator". Oto (mój) one sposób, aby osiągnąć to za pomocą C#.

Moje podejście ujawnia właściwość, która zwraca obiekt (z domyślnym indeksem), który wykona indeksowanie do odpowiedniego pola, biorąc pod uwagę lambda, aby to zrobić.

Istnieją powody, dla których możesz lub nie chcesz używać tej metody, ale zostawię to tobie. :)

+2

Dlaczego nie używać bezpośrednio indeksatora? –

+0

Ponieważ mogę mieć wiele indeksujących na klasy, które mają te same typy parametrów. Dzieci [indeks int] i Klienci [indeks int]. Również przypadek użycia OP pokazuje użycie nazwy jak w obj.Foo [...], nie obj [...] – Ani

0

To jest możliwe z ustawnikiem, ale jest wysoce niezalecane i jest całkowicie niemożliwe przy użyciu gettera, ponieważ nie ma parametru, aby ustalić, co uzyskać.

Dla setera musisz podać Dictionary<string, string> z jedną parą, ale jest to sprzeczne z tym, czego zwykle oczekujesz od setter/setter i całkowicie zatrzymuje ustawianie całego Dictionary.

Znacznie lepszym sposobem jest użycie pary metod, które możesz nazwać Get and Set, jeśli chcesz.

22

pomocą właściwość indeksatora (MSDN):

public class YourClass 
{ 
    private readonly IDictionary<string, string> _yourDictionary = new Dictionary<string, string>(); 

    public string this[string key] 
    { 
     // returns value if exists 
     get { return _yourDictionary[key]; } 

     // updates if exists, adds if doesn't exist 
     set { _yourDictionary[key] = value; } 
    } 
} 

Następnie za pomocą takich jak:

var test = new YourClass(); 
test["Item1"] = "Value1"; 
+0

Dobra! Ale jak powiedział Nicola Anusev, podczas ustawiania właściwości powinieneś sprawdzić, czy już istnieje z '_yourDictionary.ContaineKey (key)'. A jeśli ot nie istnieje, powinieneś ustawić go za pomocą 'yourDictionary.Add (klucz, wartość)' – Yoone

+1

To będzie działać tylko wtedy, gdy klasa nie jest statyczna, może warto pomyśleć o alternatywie dla klasy statycznej ... – TGarrett

0
Dictionary<string, string> param = new Dictionary<string, string>(); 

public void SetYourParameter(string parametrName, string paramValue) 
{ 
    param[parametrName] = paramValue;    
} 

public string GetYourParameter(string parametrName) 
{ 
    // ContainKey ---> It returns value if the key was found 
    if(param.ContainsKey(parametrName)) 
     return param[parametrName]; 
    else 
     return null; 
} 
Powiązane problemy