2012-01-13 3 views
9

Исходя из фона веб-разработки (JavaScript), сборники, такие как словари часто реализуются как объекты, так как их свойства могут ссылаться ассоциации:.NET Словарь против класса свойств

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

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

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

+0

Какие строки? Для чего бы вы их использовали? –

+0

Производительность, как правило, является последней проблемой при обсуждении использования свойств/полей объекта по сравнению с одним общим свойством словаря. Типовая безопасность всегда должна считаться более ценной, чем производительность в этой ситуации (хотя они, как правило, являются тем же самым ответом здесь). –

+0

@James: Я создаю сопоставления столбцов для проекта преобразования данных между двумя источниками данных, имена столбцов которых изменяются в зависимости от стороны, которая генерирует данные. –

ответ

5

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

1

C# Dictionary class строго типизирован с использованием дженериков. Вы указываете как тип ключей, так и значения при его использовании.

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

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

0

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

0

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

+1

DataTable - сложная и раздутая конструкция для типа дизайна, о котором он говорит. – doogle

+0

Возможно, в комментариях он указал, что может работать над тем, что DataTable ** может помочь с –

1

Если вы хотите сделать вид утиного ввода, который вы делаете в 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#), а также стандарты и парадигмы очень другой. Создание класса, представляющего модель данных, будет намного быстрее и, в общем, лучше, чем динамические объекты.

4

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

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

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

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

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

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

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

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

+0

+1 - Спасибо за этот совет. Я согласен со всем в вашем ответе, и ваша реализация, безусловно, более тесно согласуется с «Словарем» - я просто подумал, что мой пример более похож на класс C# и будет выглядеть немного более знакомым для всех экспертов C#. :) –

+0

Оба были бы довольно знакомы, я хочу сказать, что, хотя ваш вопрос предполагает, что JS дает совпадения, оба C# подходят одинаково, он фактически соответствует еще одному, чем другому. –

+0

А, я понимаю, что вы имеете в виду. Спасибо, что указали, что я не думал об этом так, но вы абсолютно правы. –

1

Это действительно зависит от вашего варианта использования. Словари C# намного более эффективны, чем вы могли бы ожидать от своего кода JavaScript. Плюс, так как The Don указывает, «Мы должны забыть о небольшой эффективности, скажем, около 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" 
} 
Смежные вопросы