Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET字典与类属性_C#_Javascript_Collections - Fatal编程技术网

C# .NET字典与类属性

C# .NET字典与类属性,c#,javascript,collections,C#,Javascript,Collections,来自javascript背景的集合(如字典)通常作为对象实现,因为它们的属性可以被关联引用: // js example var myDict = { namevalue1 : "value1", namevalue2 : "value2" }; myDict.namevalue1; // "value1" myDict["namevalue1"]; // "value1" 然而

来自javascript背景的集合(如字典)通常作为对象实现,因为它们的属性可以被关联引用:

// 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-然后您可以使用DLR
DynamicObject
类和新的C#4
dynamic
keyword。这是非常接近的(如果实施得当,性能会更好)比建议的
DataTable
更安全。它将提供您习惯的松散类型。即使如此,在这种情况下,类型安全仍然应该被认为是有利的,因为它具有额外的性能优势和智能感知支持。对于他所说的设计类型,DataTable是一个过于复杂和臃肿的结构t、 妈