2015-07-10 54 views
1

我創建一個列表第一如何獲取列表

List<String> dummy1 = new List<String>(); 
List<String> dummy2 = new List<String>(); 
List<String> dummy3 = new List<String>(); 
List<String> dummy4 = new List<String>(); 

的名字之前,我添加列表,字典

Dictionary<int, List<String>> _d = new Dictionary<int, List<String>>() 
{ 
    {1, dummy1}, 
    {2, dummy2}, 
    {3, dummy3}, 
    {4, dummy4}, 
}; 

那麼我想有列表的名稱通過循環的關鍵

foreach (var key in _d.Keys) 
{ 
    MessageBox.Show(_d[key].GetType().Name); 
} 

但產量list 1,我想要得到的

dummy1 
dummy2 
dummy3 
dummy4 
+2

總之;你不能。不是沒有使用一些非常時髦的語法來捕獲變量。 – Rob

+0

我想知道即將到來的c#6.0中新的「nameof」表達式是否可以在表達式樹無法做到的情況下執行此操作。 ..因爲字典有疑問,但也許有些魔法呢? –

+0

@JasonW我非常懷疑它。據我所知,nameof()是在編譯時完成的,只是用一個字符串替換了調用。例如,'var prop = nameof(dummy1)'被編譯爲'var prop =「dummy1」'。雖然我可能是錯的。 – Rob

回答

1

只需製作一個繼承自List<string>並具有Name屬性的自定義類。

using System; 
using System.Collections.Generic; 

public class Program 
{ 
    public static void Main() 
    { 
     MyList dummy1 = new MyList("dummy1"); 
     MyList dummy2 = new MyList("dummy2"); 
     MyList dummy3 = new MyList("dummy3"); 
     MyList dummy4 = new MyList("dummy4"); 

     Dictionary<int, MyList> _d = new Dictionary<int, MyList>() 
     { 
      {1, dummy1}, 
      {2, dummy2}, 
      {3, dummy3}, 
      {4, dummy4}, 
     }; 

     foreach (var key in _d.Keys) 
     { 
      Console.WriteLine(_d[key].Name); 
     } 
    } 
} 

public class MyList : List<String> 
{ 
    private string name; 
    public string Name 
    { 
     get 
     { 
      return name; 
     } 
    } 

    public MyList(string name) 
    { 
     this.name = name; 
    } 
} 

結果:

dummy1 
dummy2 
dummy3 
dummy4 

Demo

+0

感謝此代碼 –

+0

我已經應用此代碼,並且對我工作正常 –

2

您正在將數據分配給變量名稱,並且您將獲取變量名稱以訪問數據。我將創建一個名稱和列表的簡單對象,並將其添加到詞典。

Dictionary<int, List<String>> 

創建存儲列表與列表的名稱解釋:

Dictionary<string, List<String>> 

如果你想那麼

+1

反射在這種情況下甚至不起作用。在編譯代碼時,這些變量名稱會丟失。我見過得到變量名的唯一方法是通過表達式樹,但在這種情況下,即使這樣做也行不通,因爲變量名一旦在字典中被賦值就會丟失。 –

+0

@JasonW:對!更新了答案。 – CharithJ

0

而不是創建存儲的int和列表的字典得到對應於列表的整數,你可以使用一個正常的for循環,看看我們說i = 1這個位置的值是多少。

2

正如我所說,你只能用真正的時髦語法來做到這一點。下面是我的意思

void Main() 
{ 
    List<String> dummy1 = new List<String>(); 
    List<String> dummy2 = new List<String>(); 
    List<String> dummy3 = new List<String>(); 
    List<String> dummy4 = new List<String>(); 

    var _d = new Dictionary<int, Expression<Func<List<String>>>>() 
    { 
     {1,() => dummy1}, 
     {2,() => dummy2}, 
     {3,() => dummy3}, 
     {4,() => dummy4}, 
    }; 
    foreach(var kvp in _d) 
    { 
     MessageBox.Show(kvp.Value.nameof()); 
    } 
} 

// Define other methods and classes here 
public static class TestExtension 
{ 
    public static String nameof<T>(this Expression<Func<T>> accessor) 
    { 
     return nameof(accessor.Body); 
    } 

    public static String nameof<T, TT>(this T obj, Expression<Func<T, TT>> propertyAccessor) 
    { 
     return nameof(propertyAccessor.Body); 
    } 

    private static String nameof(Expression expression) 
    { 
     if (expression.NodeType == ExpressionType.MemberAccess) 
     { 
      var memberExpression = expression as MemberExpression; 
      if (memberExpression == null) 
       return null; 
      return memberExpression.Member.Name; 
     } 
     return null; 
    } 
} 

的主要問題的例子是,你需要的字典存儲的表達,而不是一個列表

其次,實際訪問的列表,你需要這樣做:

var list = _d[1].Compile()(); 

最後,如果dummy1被重新分配,您將失去對您期望的列表的引用。

總之,這是不太可能的,你需要這樣做。代碼中的變量名稱實際上會影響行爲的情況非常罕見。

+0

感謝此代碼... –