我可以使用点表示法来访问字典值吗?

时间:2010-02-08 16:40:08

标签: c#

我正在使用Dictionary<string, string>作为乐器的配置,对于那些对编程知之甚少的用户来说,能够从Visual Studio中获得自动完成功能会更容易。

在Python中,我可以创建一个Dictionary并使用点运算符访问不同的值。

d = {'name':'Joe', 'mood':'grumpy'}
d.name
d.mood

C#有办法做到这一点吗?

我意识到所有涉及的问题,因为字典只是一个通用的集合(如何通用?它只是一个KeyValuePairs列表?有趣的问题)。我不打算为此完成它的包装类(我希望它比使用自定义类的显式属性更灵活)。

4 个答案:

答案 0 :(得分:4)

您已经可以使用匿名类型在C#中执行此操作:

var d = new { name = "Joe", mood = "grumpy"};
d.name
d.mood

或真实类型:

var d = new Person { Name = "Joe", Mood = "grumpy"};
d.Name
d.Mood

而且,在C#4.0中,我们将使用DLR,它允许在运行时使用ExpandoObject添加属性:

dynamic d = new ExpandoObject();
d.name = "Joe";
d.mood = "grumpy";

但是,我不确定您是否可以在C#中使用静态分析来执行IntelliSense。

最接近你所拥有的C#

var d = new Dictionary<string, string()
    { { "name", "Joe" }, { "mood", "grumpy" } };
d["name"]
d["mood"]

哪些支持IntelliSense。

如果您正在制作API,我会使用真实的类型。

答案 1 :(得分:0)

好像你想要一个结构。 http://msdn.microsoft.com/en-us/library/0taef578.aspx

编辑:更改为更新的链接。

答案 2 :(得分:0)

你正在寻找imo方法链接。

Method chaining - why is it a good practice, or not?

字典对象是键值对的集合(使用列表),它还实现了用于访问的哈希表。就访问速度而言,它几乎是n(1)。

public class Dictionary<TKey, TValue> : IDictionary<TKey, TValue>, 
    ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, 
    IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback

取自

  

MS-帮助://MS.VSCC.v90/MS.MSDNQTR.v90.en/fxref_mscorlib/html/589059d3-d7f8-e09b-705d-91a461971cc2.htm

实际上,检索算法随着哈希表变得越来越大而变化,因为哈希表对于少量项目的效率较低。

linq方法也适用 - 不需要使用匿名类型

moodyPerson p = new moodyPerson{mood = "good", name="jim"};

然而,这并不会强迫您设置一个喜怒无常的人的所有属性,并将使用其空构造函数。

如果要按字符串访问属性,则无法使用智能感知。您需要使用反射来实现此目的。

答案 3 :(得分:0)

如果您计划在运行时实例化对象(比如从数据库调用),请不要使用ExpandoObject()获得精心设计的解决方案,没有“点符号”的智能感知,它会产生编译错误如果你试图使用它。您可以使用[“propname”]括号表示来访问它们,但此时您可能已经创建了自定义类对象,或者只是根据需要在DataTable()中操作值