如何获取列表的名称

时间:2015-07-10 03:32:21

标签: c# .net list dictionary

我先创建一个列表

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

4 个答案:

答案 0 :(得分:2)

您正在将数据分配给变量名称,并且您将获取变量名称以访问数据。我将创建一个带有Name和List的简单对象,并将其添加到Dictionary中。

答案 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;
    }
}

主要问题是您需要字典来存储表达式,而不是List

其次,要实际访问列表,您需要这样做:

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

最后,如果dummy1被重新分配,你将失去对你期望的列表的引用。

简而言之,您不太可能需要这样做。代码中的变量名实际上应该实际影响行为。

答案 2 :(得分: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

答案 3 :(得分:0)

而不是创建存储int和列表的Dictionary:

Dictionary<int, List<String>>

创建一个字典,用于存储列表名称:

Dictionary<string, List<String>>

如果您想获得与列表对应的int编号,您可以使用普通的for循环,并在我们说i = 1时查看该位置的值。