2012-11-06 12 views
6

Mam proste klasy:Zastosowanie ciąg indekser na niestandardowej klasy

public class MyClass 
{ 
    public string MyClassName { get; private set; } 
    public string MyClassValue { get; private set; } 
} 

I chcę trzymać tablicę MojaKlasa obiektów tak:

MyClass[] myClasses = new MyClass[5]; 

Czy to możliwe, bez tworzenia " kolekcja ", aby móc uzyskać dostęp do jednego z tych obiektów w tablicy obiektów za pomocą indeksera (czy to właściwa terminologia)?

Na przykład, jeśli myClasses [2] ma wartość "andegre" w nieruchomości MyClassName, jak/mogę uzyskać dostęp to tak:

MyClass andegre = myClasses["andegre"]; 

Zamiast robić coś takiego:

MyClass andegre = myClasses[GetIndexOfOfMyClassName("andegre")]; 

TIA

+1

Należy naprawdę stworzyć kolejny klasa 'MyClassCollection' z tym [indeksem] (http://msdn.microsoft.com/en-us/library/2549tw02.aspx). –

+0

rozważyć użycie słownika? – Hardrada

Odpowiedz

1

Witamy w świecie LINQ!

MyClass andegre = 
    myClasses.FirstOrDefault(item => item.MyClassValue.Equals("andegre")); 
+0

Ah, w ogóle nie korzystałem z LINQ, prawdopodobnie nadszedł czas, abym zrobił .... dzięki! – ganders

3

Za zwyczaj podziałowe do pracy w istniejącej kolekcji, że kolekcja musiałyby być zwyczaj kolekcja z indexer realizowanego przez ciebie, co może być cokolwiek argumenty chcesz zabrać ze cokolwiek logika chcesz za nią . Indywidualny indeksator pobierający ciąg jest całkowicie możliwy na niestandardowym typie.

Nie ma sposobu na przesłonięcie tego, który indekser jest używany podczas korzystania z MyClass[] (jak w natywnej macierzy .NET), wszystko, co dostajesz, to indeksujący porządek.

Alternatywnie, aby uzyskać zapytanie o dane, które chcesz, możesz użyć LINQ do obiektów (określanych jako LINQ), jak sugerowały inne odpowiedzi.

3

MyClass[] myClasses to tablica (właściwie wektor). Tablice/wektory nie mają żadnego indeksera strun - tylko dostęp pozycyjny.

Aby dostać to, co chcesz, musisz coś takiego słownika, na przykład:

var myClasses = new Dictionary<string,MyClass>(); 
myClasses.Add("Fred", new MyClass {...}); 
myClasses.Add("Betty", new MyClass {...}); 
myClasses.Add("Wilma", new MyClass {...}); 
// etc 

następnie:

MyClass obj = myClasses["Fred"]; 

czyli

MyClass obj; 
if(myClasses.TryGetValue("Fred", out obj)) { 
    // found Fred - use obj 
} else { 
    // no Fred here - don't look at obj 
} 
Powiązane problemy