Mam sytuację, w której mam obiekt biznesowy z około 15 właściwościami różnych typów. Obiekt biznesowy musi także implementować interfejs, który posiada następującą metodę:.NET: przełącznik vs słownik dla kluczy strunowych
object GetFieldValue(string FieldName);
widzę 2 sposoby realizacji tej metody:
użyć instrukcji switch:
switch (FieldName)
{
case "Field1": return this.Field1;
case "Field2": return this.Field2;
// etc.
}
Użyj słownik (SortedDictionary lub HashTable?):
return this.AllFields[FieldName];
Który byłby bardziej wydajny?
Dodano: Zapomniałem powiedzieć. Ta metoda służy do wyświetlania elementu w siatce. Siatka będzie miała kolumnę dla każdej z tych właściwości. Rutynowo będą to siatki z nieco ponad 1000 pozycji w nich. Właśnie dlatego martwię się wydajnością.
Dodany 2:
Oto pomysł: hybrydowe podejście. Utwórz statyczny słownik z kluczami będącymi nazwami właściwości i wartościami będącymi indeksami w tablicy. Słownik jest wypełniany tylko jeden raz podczas uruchamiania aplikacji. Każda instancja obiektu ma tablicę. Tak więc wyszukiwanie będzie wyglądało następująco:
return this.ValueArray[StaticDictionary[FieldName]];
Algorytm wypełniania słownika może wykorzystywać odbicie. Samo właściwości zostanie następnie zaimplementowane odpowiednio:
public bool Field1
{
get
{
object o = this.ValueArray[StaticDictionary["Field1"]];
return o == null ? false : (bool)o;
}
set
{
this.ValueArray[StaticDictionary["Field1"]] = value;
}
}
Czy ktoś może mieć z tym jakieś problemy?
Można go również posunąć o jeden krok dalej, a wartość ValueArray/StaticDictionary można umieścić w osobnym generycznym typie ValueCollection<T>
, gdzie T
określał typ odbicia. ValueCollection obsłuży także przypadek, gdy nie ustawiono jeszcze żadnej wartości. Właściwości mogą być następnie zapisywane po prostu jako:
public bool Field1
{
get
{
return (bool)this.Values["Field1"];
}
set
{
this.Values["Field1"] = value;
}
}
I w końcu, ja zaczynam znowu zastanawiać, czy to prosta instrukcja switch nie może być zarówno szybsze i łatwiejsze do utrzymania ....
Czy istnieje powód, dla którego nie wiążesz całego obiektu z siecią jako datarow? –
Prawdę mówiąc, jest to drzewo genealogiczne DevExpress. To jest jak hybryda widoku drzewa/siatki. Zatem dane muszą być hierarchiczne. Interfejs jest dostępny, dzięki czemu TreeList rozumie hierarchię. Prawdopodobnie mógłbym przetłumaczyć to wszystko na DataTable (może to również powiązać), ale jest to dla mnie wygodniejsze w dalszej pracy. –
Chodzi mi o to, że później zrobię inne rzeczy z tą strukturą danych, a nie tylko wyświetlę ją w siatce. –