2010-12-10 12 views
3

ich Klassen, Vater und Kind (von Beispiel)Acessing Objekt wie durch Index, aber namentlich in C#

Ein Ausschnitt meiner Implementierung

Klasse Father.cs

public class Father 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<Child> Children { get; set; } 

    public Father() 
    { 
    } 
} 

Klasse Child.cs

public class Child 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public Child() 
    { 
    } 

} 

Ich bin versucht, so etwas wie dieses

zu tun
 Father f = new Father(); 
     f.Children[0]; // ok 
     f.Children[1]; // ok 
     f.Children["John"]; // Duh! 

ich jetzt, sein falsch, ich brauche etwas in Child-Klasse zu implementieren, ich habe versucht diesen

public Child this[string name] 
    { 
     get 
     { 
      return this; 
     } 
    } 

Aber dies nicht funktioniert.

Wie kann ich diese Funktion für meine Klasse Child implementieren?

Antwort

4

Oder Sie können es wie folgt ein:

public class Father 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public Children Children { get; set; } 

    public Father() 
    { 
    } 
} 
public class Children : List<Child> 
{ 
    public Child this[string name] 
    { 
     get 
     { 
      return this.FirstOrDefault(tTemp => tTemp.Name == name); 
     } 
    } 
} 
public class Child 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public Child() 
    { 
    } 
} 

Dann rufen Sie es, wie Sie wollen.

+0

Nice Rangoric, Ihre Lösung funktioniert gut – Ewerton

6

Ein List<T> hat keinen String-Indexer; Sie ein in die Father Klasse hinzufügen könnte, aber die Nutzung wird:

var child = parent["Fred"]; 

(kein .Children)

Für den Indexer selbst: Versuchen (in der Indexer):

return Children.FirstOrDefault(c=>c.Name==name); 

Um einen Indexer für die Liste selbst zu erhalten, müssten Sie einen benutzerdefinierten Listentyp erstellen und den Indexer dort hinzufügen.

IMO kann ein Verfahren klarer sein (auf Vater):

public Child GetChildByName(string name) {...} 
+0

Danke Marc. Ich weiß, wie man das mit Linq macht, aber ich möchte die Funktion implementieren, um auf Indexer zuzugreifen – Ewerton

+0

Jetzt verstehe ich. Ich kann nicht auf Objekte zugreifen Listen nach String-Indizes – Ewerton

+0

+1. Das Beheben dieses Problems erklärt, warum viele der .NET Framework-Steuerelemente spezialisierte Klassen für Sammlungen verwenden. (z.B. verwendet "Kontrolle" eine "Kontrolle".ControlCollection 'statt einer' List 'für das Element' Controls'. Ich stimme Marc zu, dass die direkte Verwendung eines Indexers unklar ist. Die Idee, dass Eltern [Fred] Elternteil Kind namens Fred zurückgibt, ist wirklich nicht intuitiv. – Brian

1

Sie die Liste der Kinder wie ein Dictionary (Wörterbücher können durch Schlüssel zugegriffen werden kann) zu behandeln. Ändern Sie einfach Ihre Liste in ein Wörterbuch und legen Sie die Zeichenfolge als den Namen des Kindes fest.

+0

aber in diesem Fall kann man nicht mehr nach Index zugreifen :) –

4

In Vater Klasse, könnten Sie folgenden Code schreiben:

public Child this[string name] 
{ 
    get 
    { 
     return Children.Where(c => c.Name == name); 
    } 
} 

und verwenden Sie es mögen:

Father f = new Father(); 
    f.Children[0]; // ok 
    f.Children[1]; // ok 
    f["John"]; // ok! 
+2

+1, das ** erste ** Problem des OPs ist, dass er die 'this' Eigenschaft in die falsche Klasse gesetzt hat. –

+0

So werde ich auf den Vater mit dem Namen John und nicht das Kind mit dem Namen John – Ewerton

+0

zugreifen Das ist nicht korrekt. Auf diese Weise bitten Sie den Vater, nach einem Kind mit einem bestimmten Namen zu suchen. Das macht Vater in der Implementierung mit der Where() -Klausel. – decyclone

1

Sie konnten die Children Liste in eine OrderedDictionary so, dass Sie es durch den Index verweisen können oder Taste und fügen Sie dann die Objekte mit dem Namen als Schlüssel hinzu. Nur so dass Sie wissen, kann jede dieser Optionen zu Problemen führen, wenn Sie mehrere Kinder mit demselben Namen haben.

+0

Danke für den Zeiger auf die OrderedDictionary-Klasse. Genau das, was ich gesucht habe. – AnthonyVO

+0

@AnthonyVO - Froh, dass es geholfen hat! :) –

Verwandte Themen