исключение при использовании Dictionary
От: Аноним  
Дата: 10.07.09 08:54
Оценка:
для подсчета строк в потоке использую словарь


Dictionary<string, int> dict = new Dictionary<string, int>();
dict[key] += 1;


но если ключа еще нет, то вылетает исключение
можно сделать так

try
{
   dict[key] += 1;
}
catch ()
{
   dict[key] = 1;
}


другие варианты есть ?
Re: исключение при использовании Dictionary
От: QrystaL Украина  
Дата: 10.07.09 08:57
Оценка:
А>но если ключа еще нет, то вылетает исключение

Dictionary<string, int> dict = new Dictionary<string, int>();
if (dict.ContainsKey(key))
{
    dict[key] += 1;
}
Re: исключение при использовании Dictionary
От: Хэлкар  
Дата: 10.07.09 09:19
Оценка:
А>другие варианты есть ?

Dictionary<string, int> dict = new Dictionary<string, int>();
dict[key] = dict.ContainsKey(key) ? dict[key]+1 : 1;
Re[2]: исключение при использовании Dictionary
От: andrb Украина http://bezzub.com
Дата: 10.07.09 10:02
Оценка:
Здравствуйте, QrystaL, Вы писали:

QL>if (dict.ContainsKey(key))

QL>{
QL> dict[key] += 1;
QL>}
QL>[/c#]

Правильнее воспользоваться методом TryGetValue() чтобы уменьшить колличество проверок на наличие ключа в dictionary:

int value;
if (!dict.TryGetValue(key, out value))
{
    value = 0;
}

dict[key] = value + 1;
Re: исключение при использовании Dictionary
От: samius Япония http://sams-tricks.blogspot.com
Дата: 10.07.09 10:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>для подсчета строк в потоке использую словарь


А>другие варианты есть ?


keys.Distinct().Count()
Re[2]: исключение при использовании Dictionary
От: Хэлкар  
Дата: 10.07.09 11:10
Оценка:
S>
S>keys.Distinct().Count()
S>


первое, не используйте Count для проверки пустоты — используйте Any()
второе, более медленный способ трудно придумать
Re[3]: исключение при использовании Dictionary
От: samius Япония http://sams-tricks.blogspot.com
Дата: 10.07.09 11:13
Оценка:
Здравствуйте, Хэлкар, Вы писали:

S>>
S>>keys.Distinct().Count()
S>>


Х>первое, не используйте Count для проверки пустоты — используйте Any()

Причем тут пустота? Нужно число строк.

Х>второе, более медленный способ трудно придумать

Нетрудно.
Re[4]: исключение при использовании Dictionary
От: Хэлкар  
Дата: 10.07.09 11:22
Оценка:
Х>>первое, не используйте Count для проверки пустоты — используйте Any()
S>Причем тут пустота? Нужно число строк.

А зачем нужно количество строк.
Re[5]: исключение при использовании Dictionary
От: samius Япония http://sams-tricks.blogspot.com
Дата: 10.07.09 11:28
Оценка:
Здравствуйте, Хэлкар, Вы писали:

Х>>>первое, не используйте Count для проверки пустоты — используйте Any()

S>>Причем тут пустота? Нужно число строк.

Х>А зачем нужно количество строк.


С этим к автору топика.
А вот откуда взялась проверка пустоты? И для чего в проверке пустоты мог понадобиться словарь?
Re[2]: исключение при использовании Dictionary
От: Ellin Россия www.rsdn.ru
Дата: 10.07.09 11:54
Оценка:
Здравствуйте, samius, Вы писали:
S>Здравствуйте, Аноним, Вы писали:
А>>для подсчета строк в потоке использую словарь
А>>другие варианты есть ?
S>
S>keys.Distinct().Count()
S>

Извините, у меня пара вопросов.
1. Зачем Distinct
2. Так ведь вернется колличество строк в потоке, а он считает колличество вхождения каждой строки в поток.
Re[3]: исключение при использовании Dictionary
От: samius Япония http://sams-tricks.blogspot.com
Дата: 10.07.09 12:15
Оценка:
Здравствуйте, Ellin, Вы писали:

E>Здравствуйте, samius, Вы писали:

S>>Здравствуйте, Аноним, Вы писали:
А>>>для подсчета строк в потоке использую словарь
А>>>другие варианты есть ?
S>>
S>>keys.Distinct().Count()
S>>

E>Извините, у меня пара вопросов.
E>1. Зачем Distinct
E>2. Так ведь вернется колличество строк в потоке, а он считает колличество вхождения каждой строки в поток.

Видимо я не верно понял задачу. Подумал, что нужно кол-во уникальных строк.
Re: исключение при использовании Dictionary
От: _FRED_ Черногория
Дата: 11.07.09 03:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>для подсчета строк в потоке использую словарь


А>другие варианты есть ?

int value;
if(!dict.TryGetValue(key, out value)) {
  dict.Add(key, 0 /* начальное значение */);
} else {
  dict[key] = value + 1;
}//if


Так же интересным может показаться выриант хранения в словаре не int-а, а
class Counter
{
  public int ValuesCount { get; set; }

  public void Increment() {
    ValuesCount++;
  }
}

тогда требуется ещё меньше операций поиска в словаре:
Counter counter;
if(!dict.TryGetValue(key, out counter)) {
  dict.Add(key, counter = new Counter());
}//if
counter.Increment();
Help will always be given at Hogwarts to those who ask for it.
Re[2]: исключение при использовании Dictionary
От: _FRED_ Черногория
Дата: 11.07.09 03:58
Оценка:
Здравствуйте, _FRED_, Вы писали:

Поправочка:
_FR>int value;
_FR>if(!dict.TryGetValue(key, out value)) {
_FR>  dict.Add(key, 1 /* начинать, конечно, имеетт смысл с еденицы */);
_FR>} else {
_FR>  dict[key] = value + 1;
_FR>}//if


_FR>тогда требуется ещё меньше операций поиска в словаре:


или даже лучше так:
_FR>Counter counter;
_FR>if(!dict.TryGetValue(key, out counter)) {
      dict.Add(key, new Counter { ValuesCount = 1, });
    } else {
      counter.Increment();
_FR>}//if
Help will always be given at Hogwarts to those who ask for it.
Re[3]: исключение при использовании Dictionary
От: evi  
Дата: 11.07.09 08:43
Оценка:
Здравствуйте, andrb, Вы писали:
A>Правильнее воспользоваться методом TryGetValue() чтобы уменьшить колличество проверок на наличие ключа в dictionary:

A>
A>int value;
A>if (!dict.TryGetValue(key, out value))
A>{
A>    value = 0;
A>}

A>dict[key] = value + 1;
A>


И чем это лучше?
Re[4]: исключение при использовании Dictionary
От: Lloyd Россия  
Дата: 11.07.09 11:31
Оценка:
Здравствуйте, evi, Вы писали:

evi>И чем это лучше?


1. Вместо 3-х поисков в словаре только 2.
2. Твой вариант неправильный — словарь всегда будет оставаться пустым.
Re: исключение при использовании Dictionary
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.07.09 15:40
Оценка:
Здравствуйте, Аноним, Вы писали:

http://rsdn.ru/forum/dotnet/3454919.1.aspx
Автор: Serginio1
Дата: 03.07.09

http://rsdn.ru/article/alg/tlsd.xml
Автор(ы): Сергей Смирнов (Serginio1)
Дата: 14.08.2004
Пример реализации двухуровневого массива с помощью нового средства С# — generics. Сравнение производительности различных реализаций сортированных списков.


Там есть такой код

Pos = HT.NavigateOrInsertDefault(word, out exists);
                if (!exists)
                    HT.Buckets[Pos].Value = 1;
                else
                    HT.Buckets[Pos].Value++;

таким образом скорость в 2 раза больше чем у стандартной
и солнце б утром не вставало, когда бы не было меня
Re[2]: исключение при использовании Dictionary
От: Caracrist https://1pwd.org/
Дата: 12.07.09 06:48
Оценка:
Здравствуйте, Хэлкар, Вы писали:

А>>другие варианты есть ?


Х>
Х>Dictionary<string, int> dict = new Dictionary<string, int>();
Х>dict[key] = dict.ContainsKey(key) ? dict[key]+1 : 1;
Х>


Dictionary<string, int> dict = new Dictionary<string, int>();
...
int _value;
dict.Add(key, dict.TryGetValue(key, out _value) ? (_value + 1) : 1);
~~~~~
~lol~~
~~~ Single Password Solution
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.