2016-06-01 2 views
0

私はC#WPFアプリケーションを開発中です。ここに私のコードのサンプルです:リストの名前を取得するには<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>(); 

それから私はこのような別のリストを持っている:

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

私は文字列として、BまたはCにアクセスする必要があります。だから私はアルファベットリスト内の項目の名前を取得する必要があります。リストには名前プロパティがないようです。

+0

あなたが示していただけますか'a'、' b'、 'c'の文字列値にアクセスしようとしていて、エラーを受け取った行?また、これはコードスニペットが限られていることが原因ですが、リストのリストはなぜですか? – gravity

+1

すべてのリストのすべての文字列を1つの文字列に結合しますか?それで 'String.Join'はあなたの友人です。 – HimBromBeere

+3

'a'、' b'、 'c'は_variables_です。変数は、あなたの 'List 'インスタンスへの参照_を含んでいます。しかし、これらの変数の名前は、インスタンスの_no property_です。 'var d = a;'リストの "名前"は "a"か "d"になりますか?ここであなたのミキシングするもの... –

答えて

1

あなたが求めていることは不可能です。 a,bおよびcはコンパイラによって解析されるローカル変数名ですが、実際にはプロセス全体では保持されません。コンパイルされた最終的なDLLまたはEXEには、これらの変数の名前は含まれず、メモリ位置への参照だけが含まれます。これらの名前を実行時に取得する方法はありません。データ構造の一部ではなく、メタデータとして利用することもできません。

あなたの名前は特定のリストに名前でアクセスできるようになっているようですが、a)リストには名前がありません。b)リストは外部リストです。名前でオブジェクトにアクセスするためのデータ構造。 PHPのようにデフォルトでassociative arraysを使用する言語とは異なり、C#はデータ構造がより厳格です。List<T>は、連想配列ではなくインデックスでアクセス可能な配列バックアップリストです。

名前でオブジェクトにアクセスする場合は、そのために設計されたデータ構造(この場合はDictionary<string, List<string>>)を使用する必要があります。

var cList = lists["q"]; 

代替解釈

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. 

あなたはその後、辞書のインデクサプロパティを介し名によって特定のリストにアクセスできます。これは、オブジェクトにアクセスするには、あなたがキーとして名を設定することができます

質問が完全にはっきりしていないので、1つのコメントに基づいて、何らかの理由でList<string>クラスを拡張して名前を持ち帰りたいたとえそれがあなたのコードを特定のデータベース構造に結びつけるかなり悪いデザインであっても、それに関連した名前があります。

これはList<string>をサブクラス化し、新しいプロパティを追加することによって達成することができます。

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

さて、代わりにList<string>を作成するのではなく、あなたがNamedListを作成します:

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

Anvar Shahar-Kashtanありがとうございます。私は、データメンバとしてリストと文字列を持つクラスを定義しました。その後、そのクラスのインスタンスに対して、私はそれらの両方にアクセスできます。あなたの両方の方法は正しい – Bahman

関連する問題