Словарь .NET против свойств класса - PullRequest
11 голосов
/ 13 января 2012

Исходя из фона javascript, коллекции, такие как словари, часто реализуются как объекты, потому что на их свойства можно ссылаться по ассоциации:

// Javascript example
var myDictionary = {
  namevalue1 : "value1",
  namevalue2 : "value2"
};

console.log( myDictionary.namevalue1 );    // "value1"
console.log( myDictionary["namevalue1"] ); // "value1"

Я сейчас пишу на C #, и я хотел бы знать, еслиПравильный способ хранения строковых значений для поиска - в одноэлементном классе или в универсальном словаре.Мне нравится, что классы строго типизированы и предоставляют поддержку intellisense, но я ожидаю много изменений и поддерживаю свойства класса, а простой вызов методов Dictionary кажется головной болью.Разве преимущества в производительности настолько велики, что я должен выбирать одно над другим?

Ответы [ 7 ]

7 голосов
/ 13 января 2012

На самом деле, класс будет на несколько порядков быстрее, чем Dictionary.Если вы чувствуете, что это удобнее, это даже лучше :) Так что, если вы можете делать уроки для этого, сделайте это.Если объекты, которые вы представляете, на самом деле должны быть классами (т. Е. В основном объектами, а не парами ключ / значение), тогда все больше причин.

4 голосов
/ 13 января 2012

Ваш пример javascript не соответствует словарю, а также:

var myDictionary = [];
myDictionary["namevalue1"] = "value1";
myDictionary["namevalue2"] = "value2";

Теперь мы можем делать все с моим кодом, что мы можем делать с вашим, но на самом деле это не то же самое, что моделирование.Твоя определяет свойства, а моя ассоциирует значения с ключами.Вы семантически создали структурированный объект, я создал более плоский объект, хотя у меня есть немного больше гибкости в случае, когда я не знаю, какую строку я буду использовать в качестве ключа (не намного больше в js, так как jsГибкость времени выполнения означает, что не так сложно динамически добавлять новые свойства, если ключ является допустимой меткой.

Так же, как в Javascript, в C #:

Если у вас небольшой набор свойств,известны во время компиляции, тогда класс с такими свойствами наиболее точно моделирует ваше намерение.

Если у вас большой набор свойств или вы не знаете их во время компиляции, то словарь будет наиболее точно моделировать вашНамерение.

Тот факт, что они, вероятно, будут наиболее эффективными в обоих случаях, является просто бонусом, сначала смоделируйте свои намерения настолько хорошо, насколько позволяет язык, подумайте об уходе от того, что происходит позже, если это абсолютно необходимо.

На самом деле ничем не отличается от JS, за исключением того, что он немного более строг в отношении того, что вы делаете в данный момент (мыможно обойти эту строгость, если мы действительно нуждаемся, но вы?).

1 голос
/ 13 января 2012

Это действительно зависит от вашего варианта использования.Словари 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 голос
/ 13 января 2012

Если вы хотите делать утку, как в javascript, но в C #, вы можете использовать ExpandoObject. Это класс .Net 4. Вы можете динамически устанавливать его свойства, такие как:

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

Имейте в виду вы переходите от динамического языка ( javascript ) к статическому языку ( C # ), и стандарты и парадигмы очень отличается. Создание класса, представляющего модель данных, будет намного быстрее и, в целом, будет лучше, чем динамические объекты.

1 голос
/ 13 января 2012

Класс C # Dictionary строго типизирован с использованием шаблонов.При его использовании вы указываете и тип ключей, и значения.

Я бы порекомендовал узнать о классе словаря, поскольку вы, вероятно, найдете его полезным для многих целей.

ЭтоТрудно комментировать дальше, не зная больше о вашем сценарии использования, но в целом я не буду беспокоиться о производительности класса Dictionary, пока вы не узнаете, что это проблема, и позже выполните рефакторинг, если это так.(Я смело предсказываю, что этого не будет).

0 голосов
/ 13 января 2012

, так как вы используете его для данных .... "DataTable", который является абстракцией Microsoft именно этого, в основном большой словарь. Возможно, вы захотите исследовать DataTable, так как он содержит множество игрушек, которые МОГУТ сделать вашу жизнь намного проще.

0 голосов
/ 13 января 2012

Класс со свойствами даст вам повышение производительности и поддержку intellisense.С другой стороны, словарь может дать вам больше гибкости, если вам это нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...