Словарь объектов производительности - PullRequest
3 голосов
/ 14 декабря 2011

У меня есть возможный сценарий реализации, где мне нужен объект словаря, который будет принимать 3 переменные.Диалект, имя запроса и строка запроса.На этом этапе я должен отметить, что написание отдельного объекта класса не вариант.

Мой вопрос в том, что из следующего будет работать лучше.

A) Один объект словаря, который принимает первые две переменные в качестве составного ключа, например, "диалект, имя_периода" и 3-ю переменную в качестве значения.

private Dictionary<string, string>

B) Словарьобъект, который имеет другой объект словаря в качестве значения, поэтому первая переменная будет ключом основного словарного объекта, 2-я переменная будет ключом 2-го словарного объекта, и, наконец, 3-я переменная будет значением второго словарного объекта.

private Dictionary<string, Dictionary<string, string>>

Кажется очевидным, но компилятор - загадочная вещь, поэтому подумал, что я должен спросить вас, ребята.

Спасибо

Ответы [ 4 ]

2 голосов
/ 14 декабря 2011

Просто слоняюсь по округе ради собственного удовольствия ..

             Dictionary<string, string> md1 = new Dictionary<string,string>();
             Dictionary<string, Dictionary<string, string>> md2 = new Dictionary<string, Dictionary<string, string>>();

             Stopwatch st = new Stopwatch();

             st.Start(); 

             for (int i = 0; i < 2000000; i++)
             {
                 md1.Add(i.ToString(), "blabla"); 
             }

             st.Stop();

             Console.WriteLine(st.ElapsedMilliseconds);

             st.Reset();

             st.Start(); 

             for (int i = 0; i < 2000000; i++)
             {
                 md2.Add(i.ToString(), new Dictionary<string, string>()); 
             }

             st.Stop();

             Console.WriteLine(st.ElapsedMilliseconds);

             Console.ReadLine(); 

вывод:

831
1399
2 голосов
/ 14 декабря 2011

Пока вы уверены, что ключ "диалект, квинаим" уникален, я думаю, что первое решение быстрее. Во втором случае вам придется выполнить еще один поиск по словарю, который, вероятно, будет более дорогостоящим, чем конкатенация строк.

0 голосов
/ 14 декабря 2011

Это не вопрос производительности, так как оба имеют совершенно разную семантику.

Первый дает вам возможность использовать один объект для поиска другого объекта.

Второй дает вам возможность использовать один объект для поиска другого объекта, в котором вы можете использовать еще один объект для поиска третьего объекта.

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

В общем, я бы использовал Dictionary<Tuple<string, string>, string>. Это даст мне составной ключ, который явно является составным ключом.

На самом деле, это не так, я бы создал новый класс. Как это не вариант? Тем не менее, если бы это было домашнее задание и «не создавайте новый класс» было частью вопроса, я бы использовал Dictionary<Tuple<string, string>, string>.

Edit:

class DialectQuery : IEquatable<DialectQuery>
{
  public Dialect{get;private set}
  public Name{get;private set;}
  public DialectQuery(string dialect, string name)
  {
    Dialect = dialect;
    Name = name;
  }
  public bool Equals(DialectQuery other)
  {
    return other != null && Name == other.Name && Dialect == other.Dialect;
  }
  public override bool Equals(object other)
  {
    return Equals((object)other);
  }
  public override int GetHashCode()
  {
    int dHash = Dialect.GetHashCode();
    return (dHash << 16 | dHash >> 16) ^ Name.GetHashCode();
  }
}

Пока он ведет себя точно так же, как и Tuple. Хотя теперь, если я получаю запрос на изменение, диалекты должны быть нечувствительными к регистру, но имена запросов чувствительны к регистру, или что диалекты являются кодами и, следовательно, требуют инвариантного сравнения, но имена вводятся человеком и, следовательно, требуют сравнения с учетом культуры или чего-либо еще, Мне нужно сделать два простых изменения.

YAGNI не применяется, это не кодирование массивного объекта «на тот случай, если вам это нужно», это определение хорошего «хорошо, я, вероятно, не нуждаюсь в этом, но если я это сделаю, я пойду сюда».

0 голосов
/ 14 декабря 2011

Почему бы вам не использовать:

Dictionary<string, KeyValuePair<string, string>>

Я думаю, что лучше, чем оба.

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