2016-06-01 5 views
0

Ich arbeite an einer C# -WPF-Anwendung. Hier ist ein Beispiel von meinem Code:Wie bekomme ich den Namen einer Liste <string>

private static List<string> a = new List<string>(); 
private static List<string> b = new List<string>(); 
private static List<string> c = new List<string>(); 

Dann habe ich noch eine Liste wie folgt aus:

private static List<List<string>> alphabet = new List<List<string>>() { a, b, c }; 

Ich brauche einen zuzugreifen, b oder c als String zurück. also muss ich den Namen der Artikel in der alphabetischen Liste finden. Es scheint, dass die Liste keine Namenseigenschaft hat.

+0

bitte Sie zeigen das:

public class NamedList<T> : List<T> { public NamedList(string name) { Name = name; } public string Name {get;set;} } 

Statt nun die Schaffung eines List<string> Sie eine NamedList erstellen werden Zeile, in der Sie versuchen, auf die Zeichenfolgenwerte in 'a',' b' und 'c' zuzugreifen, und den Fehler erhalten? Auch, und dies kann aufgrund der begrenzten Code-Schnipsel sein, aber warum eine Liste einer Liste? – gravity

+1

Möchten Sie alle Zeichenfolgen aus allen Ihren Listen in einer einzigen Zeichenfolge kombinieren? Dann ist 'String.Join' dein Freund. – HimBromBeere

+3

'a',' b' und 'c' sind _variables_. Variablen _ enthalten einen Verweis auf Ihre 'List ' Instanzen. Aber die Namen dieser Variablen sind _keine Eigenschaft_ der Instanzen. Stellen Sie sich eine 'var d = a;' Wäre der "Name" der Liste jetzt "a" oder "d"? Sie mischen etwas hier oben ... –

Antwort

1

Was Sie verlangen, ist unmöglich. a, b und c sind lokale Variablennamen, die vom Compiler analysiert werden, aber während des gesamten Prozesses nicht beibehalten werden. Die letzte kompilierte DLL oder EXE enthält nicht die Namen dieser Variablen, nur Verweise auf Speicherorte. Es gibt keine Möglichkeit, diese Namen zur Laufzeit zu erhalten - sie sind weder Teil der Datenstruktur noch sind sie als Metadaten verfügbar.

Es scheint, dass Sie nach einer bestimmten Liste nach Namen suchen möchten, aber a) eine Liste hat keinen Namen und b) eine Liste, die äußere Liste, ist nicht gut Datenstruktur für den Zugriff auf Objekte nach Name. Im Gegensatz zu Sprachen wie PHP, die standardmäßig associative arrays verwenden, ist C# mit seinen Datenstrukturen strenger - eine List<T> ist eine indexzugängliche Array-unterstützte Liste, kein assoziatives Array.

Wenn Sie mit dem Namen auf ein Objekt zugreifen möchten, müssen Sie eine Datenstruktur verwenden, die dafür entworfen wurde - in diesem Fall eine Dictionary<string, List<string>>. Dies ermöglicht Ihnen, einen Namen als Schlüssel zu setzen auf ein Objekt zuzugreifen:

private List<string> a = new List<string>(); 
private List<string> b = new List<string>(); 
private List<string> c = new List<string>(); 

private Dictionary<string, List<string>> lists = new Dictionary<string, List<string>>(); 
lists.Add("a", a); 
lists.Add("b", b); 
lists.Add("q", c); // note that the key isn't related to the variable name. 

Anschließend können Sie eine bestimmte Liste von Namen durch die Dictionary-Eigenschaft Indexer zugreifen:

var cList = lists["q"]; 

Alternative Interpretation

Da Ihre Frage nicht ganz klar ist, ist es basierend auf einem Kommentar möglich, dass Sie einfach die List<string> Klasse erweitern möchten, um aus irgendeinem Grund auch einen Namen zu tragen - vielleicht um eine SQL Registerkarte zu speichern Der Name ist damit verbunden, auch wenn das ein ziemlich schlechtes Design ist, das Ihren Code mit einer bestimmten Datenbankstruktur verbindet.

Dies kann durch Subklassen List<string> und das Hinzufügen einer neuen Eigenschaft erreicht werden:

var a = new NamedList<string>("a"); 
var q = new NAmedList<string>("c"); 
+0

Danke Anvar Shahar-Kashtan. Ich habe eine Klasse mit einer Liste und einer Zeichenfolge als Datenelemente definiert. Dann habe ich für jede Instanz dieser Klasse Zugriff auf beide. Deine beide Wege sind jedoch korrekt – Bahman

Verwandte Themen