2012-11-06 7 views
6

Ich habe eine einfache Klasse:Verwenden Zeichenfolge Indexer auf benutzerdefinierte Klasse

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

Und ich möchte ein Array von MyClass diese Objekte wie halten:

MyClass[] myClasses = new MyClass[5]; 

Ist es möglich, ohne die Schaffung eines " Objekt "collection", um mit dem String-Indexer auf eines dieser Objekte im Array von Objekten zugreifen zu können (ist das die richtige Terminologie)?

Zum Beispiel, wenn myclasses [2] den Wert "andegre" in der MyClassName Eigenschaft hat, wie/kann ich auf es wie folgt aus:

MyClass andegre = myClasses["andegre"]; 

Statt etwas wie tun:

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

TIA

+1

Sie sollten wirklich eine andere erstellen Klasse 'MyClassCollection' mit dem [Indexer] (http://msdn.microsoft.com/en-us/library/2549tw02.aspx). –

+0

in Betracht ziehen, ein Wörterbuch zu verwenden? – Hardrada

Antwort

1

Willkommen in der Welt von LINQ!

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

Ah, ich habe LINQ überhaupt nicht benutzt, es ist wahrscheinlich an der Zeit, dass ich .... danke! – ganders

3

Für eine benutzerdefinierte Indexer auf einer bestehenden Sammlung arbeiten, dass die Sammlung müsste eine eigene Kollektion mit dem indexer von Ihnen implementiert sein, was, was auch immer Argumente, mit denen Sie nehmen wollen sein kann, was Logik, die Sie dahinter wollen . Ein benutzerdefinierter Indexer, der eine Zeichenfolge verwendet, ist bei einem benutzerdefinierten Typ problemlos möglich.

Es gibt keine Möglichkeit zu überschreiben, welcher Indexer verwendet wird, wenn Sie eine MyClass[] (wie in einem nativen .NET-Array) verwenden. Alles, was Sie erhalten, ist der ordinale Indexer.

Alternativ zur Abfrage der gewünschten Daten können Sie LINQ to Objects (nur LINQ genannt) verwenden, wie die anderen Antworten vorgeschlagen haben.

3

MyClass[] myClasses ist ein Array (eigentlich ein Vektor). Arrays/Vektoren haben keine irgendeinen String Indexer - nur Positionszugriff.

zu bekommen, was Sie wollen, würden Sie so etwas wie ein Wörterbuch, zum Beispiel benötigen:

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

dann:

MyClass obj = myClasses["Fred"]; 

oder:

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