C# .NET字典与类属性
来自javascript背景的集合(如字典)通常作为对象实现,因为它们的属性可以被关联引用:C# .NET字典与类属性,c#,javascript,collections,C#,Javascript,Collections,来自javascript背景的集合(如字典)通常作为对象实现,因为它们的属性可以被关联引用: // js example var myDict = { namevalue1 : "value1", namevalue2 : "value2" }; myDict.namevalue1; // "value1" myDict["namevalue1"]; // "value1" 然而
// js example
var myDict = {
namevalue1 : "value1",
namevalue2 : "value2"
};
myDict.namevalue1; // "value1"
myDict["namevalue1"]; // "value1"
然而,在C#中,对于每种效果,我们似乎必须在静态单例类和泛型字典之间进行选择。虽然我喜欢类是强类型的,并提供智能感知支持,但字典方法提供了灵活性,我对此犹豫不决。在C语言中是否有如此重要的性能考虑因素,以至于我应该选择一个而不是另一个?事实上,一个类比一个
字典要快几个数量级。如果你觉得它更方便,那就更好了:)所以如果你能为它制作课程,就这样做吧。如果您所表示的对象确实应该是类(即基本上是对象,而不是键/值对),那么更重要的原因是。使用泛型进行强类型化。使用时,可以指定键的类型和值
我建议你学习字典类,因为你很可能会发现它在很多方面都很有用
在不了解更多用例的情况下,很难进行进一步的评论,但一般来说,我不会担心Dictionary类的性能,除非您知道这是一个问题,如果是的话,我会在以后重构它。(我勇敢地预测不会发生这种情况)。带有属性的类将为您提供性能提升和智能感知支持。另一方面,字典可以给你更多的灵活性,如果你需要的话。因为你用它来处理数据。。。。“DataTable”是微软对这一点的抽象,基本上是一个大字典。您可能需要调查DataTable,因为它附带了很多玩具,可以让您的生活更轻松。如果您想像javascript中那样使用duck类型,但在C#中,您可以使用ExpandoObject。这是一个.NET4类。您可以动态设置其属性,如:
dynamic myObject = new ExpandoObject();
myObject.namevalue1 = "value1";
myObject.namevalue2 = "value2";
参考您正在尝试的操作,ExpandoObject带来的一个好技巧是,您可以使用与访问字典值相同的方式访问ExpandoObject上的属性:
var myDictionary = myObject as IDictionary<string, object>;
Console.WriteLine(myDictionary["namevalue1"]); // value1
Console.WriteLine(myDictionary["namevalue2"]); // value2
var myDictionary=myObject作为IDictionary;
Console.WriteLine(myDictionary[“namevalue1”]);//价值1
Console.WriteLine(myDictionary[“namevalue2”]);//价值2
请记住您正从一种动态语言(javascript)转变为一种静态语言(C#),并且标准和范例非常不同。创建一个表示数据模型的类将比动态对象花费的时间要快得多,而且一般来说,形式更好 您的javascript示例与字典不符,并且:
var myDictionary = [];
myDictionary["namevalue1"] = "value1";
myDictionary["namevalue2"] = "value2";
现在,我们可以用我的代码做任何我们可以用你的代码做的事情,但它并不是真正的建模相同的事情。您的定义属性,而我的将值与键关联。您已经在语义上创建了一个结构化对象,我创建了一个更平坦的对象,尽管我在不知道将使用什么字符串作为键的情况下有一点灵活性(在js中没有那么多,因为js的运行时灵活性意味着,如果键是有效的标签,动态添加新属性并不太困难)
就像在Javascript中一样,在C#中:
如果您有一小组在编译时已知的属性,那么具有这些属性的类将最接近您的意图
如果您有一大组属性,或者在编译时不知道它们,那么字典将最接近您的意图
事实上,无论哪种情况,这些都可能是最有效的,这只是一个额外的好处。首先,在语言允许的范围内尽可能好地模拟您的意图,如果绝对必要的话,请考虑在以后放弃这样做
与JS实际上没有什么不同,只是它对您一次要做的事情有点严格(如果我们真的需要,我们可以绕过这种严格的要求,但是您呢?)这取决于您的用例。C#字典的性能比您通常从JavaScript代码中预期的要高。另外,正如所指出的,“我们应该忘记小效率,比如说97%的时间;过早优化是万恶之源”。我提供了两个示例,它们提供了与示例JavaScript相同的输出:
enum DictKeys
{
nameValue1,
nameValue2,
}
void Main()
{
var myDictionary = new Dictionary<string, string>();
myDictionary.Add("namevalue1", "value1");
myDictionary.Add("namevalue2", "value2");
Console.WriteLine(myDictionary["namevalue1"]); // "value1"
var myDict2 = new Dictionary<DictKeys, string>();
myDict2.Add(DictKeys.nameValue1, "value1");
myDict2.Add(DictKeys.nameValue2, "value2");
Console.WriteLine(myDict2[DictKeys.nameValue1]); // "value1"
}
枚举密钥
{
名称值1,
名称值2,
}
void Main()
{
var myDictionary=newdictionary();
添加(“名称值1”、“值1”);
myDictionary.Add(“namevalue2”、“value2”);
Console.WriteLine(myDictionary[“namevalue1”]);/“value1”
var myDict2=新字典();
myDict2.添加(DictKeys.nameValue1,“value1”);
myDict2.添加(DictKeys.nameValue2,“value2”);
Console.WriteLine(myDict2[DictKeys.nameValue1]);/“value1”
}
什么类型的字符串?您将使用它们做什么?与单个泛型字典属性相比,在讨论在对象上使用属性/字段时,性能通常是最后一个问题。在这种情况下,类型安全应始终被认为比性能更有价值(尽管这里的答案往往相同)@James:我正在为两个数据源之间的数据转换项目创建列映射,这些数据源的列名根据生成数据的一方而发生变化。@ajax81-顺便问一下,您针对的是哪个版本的框架?@ajax81-然后您可以使用DLRDynamicObject
类和新的C#4dynamic
keyword。这是非常接近的(如果实施得当,性能会更好)比建议的DataTable
更安全。它将提供您习惯的松散类型。即使如此,在这种情况下,类型安全仍然应该被认为是有利的,因为它具有额外的性能优势和智能感知支持。对于他所说的设计类型,DataTable是一个过于复杂和臃肿的结构t、 妈