2012-11-06 18 views
6

Ho una semplice classe:Usa indicizzatore stringa sulla classe personalizzata

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

e voglio tenere una serie di MyClass oggetti come questo:

MyClass[] myClasses = new MyClass[5]; 

E 'possibile, senza creare un " collezione "oggetto, per poter accedere a uno di quegli oggetti nella matrice di oggetti tramite l'indicizzatore di stringhe (è la terminologia corretta)?

Per esempio, se myClasses [2] ha il valore "andegre" nella proprietà MyClassName, come/posso accedere in questo modo:

MyClass andegre = myClasses["andegre"]; 

Invece di fare qualcosa di simile:

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

TIA

+1

si dovrebbe davvero creare un altro class' MyClassCollection' con quello [indexer] (http://msdn.microsoft.com/en-us/library/2549tw02.aspx). –

+0

considera l'utilizzo di un dizionario? – Hardrada

risposta

1

Benvenuti nel mondo di LINQ!

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

Ah, non ho usato LINQ affatto, è probabilmente tempo che lo faccio .... grazie! – ganders

3

Per un indicizzatore personalizzato per lavorare su una raccolta esistente, che la raccolta avrebbe bisogno di essere una raccolta personalizzata con il indexer attuato da te, che può essere qualsiasi argomento si vuole prendere con qualsiasi logica che vuoi dietro di esso . Un indicizzatore personalizzato che accetta una stringa è perfettamente possibile su un tipo personalizzato.

Non è possibile sovrascrivere l'indicizzatore utilizzato quando si utilizza uno MyClass[] (come in un array nativo .NET). Tutto ciò che si ottiene è l'indicizzatore ordinale.

In alternativa, per richiedere i dati desiderati è possibile utilizzare LINQ to Objects (denominato semplicemente LINQ) come suggerito dalle altre risposte.

3

MyClass[] myClasses è un vettore (in realtà, un vettore ). Gli array/vettori non hanno alcun indicizzatore di stringhe - solo l'accesso posizionale.

per ottenere ciò che si vuole, si avrebbe bisogno di qualcosa come un dizionario, per esempio:

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

poi:

MyClass obj = myClasses["Fred"]; 

o:

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