:: Не фоксом единым
C# SortedDictionary
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Решил успокоить нервы после работы с Java, почитал книгу "Основы разработки приложений на платформы .NET Framework (70-536)". Наткнулся на табличку, в которой приведено сопоставление обобщённых и необобщённых коллекций (списков и словарей):

[attachment 27485 s2__.png]

Заинтересовал выделенный класс - что то не припомню такого. Я правильно понимаю, что необобщённого SortedDictionary не существует, и что в книге опечатка? Не может же быть ситуации, что сейчас класса нет, а раньше он был?



Исправлено 1 раз(а). Последнее : S-type, 25.04.17 16:49
Ratings: 0 negative/0 positive
Re: C# SortedDictionary
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Да, опечатка.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: C# SortedDictionary
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
И, вот такой вопрос. Проверил:

NameValueCollection nv = new NameValueCollection();
nv.Add("key1", "первое значение");
nv.Add("key1", "второе значение");
Console.WriteLine(nv.GetValues("key1").Length); // выведет 2
foreach (string s in nv.GetValues("key1")) // получаем все значения ключа key1
{
Console.WriteLine(s);
}

В то же время код:

Dictionary<string, string> countries = new Dictionary<string, string>(2);
countries.Add("key1", "первое значение");
countries.Add("key1", "второе значение"); // !

сваливается с ошибкой.

NameValueCollection допускает неуникальность ключей. Выходит, его нельзя заменить на Dictionary<string, string>?
Ratings: 0 negative/0 positive
Re: C# SortedDictionary
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Цитата:
Every key in a Dictionary<TKey,TValue> must be unique according to the dictionary's equality comparer. A key cannot be null, but a value can be, if the value type TValue is a reference type.
Нельзя заменить - там ещё и null в качестве ключа может быть...


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 25.04.17 18:27
Ratings: 0 negative/0 positive
Re: C# SortedDictionary
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Т.е. строку NameValueCollection - Dictionary из списка вычёркиваем.

Так же, вызывает сомнение связка OrderedDictionary - Dictionary. Ведь в OrderedDictionary используется DictionaryEntry.
Ratings: 0 negative/0 positive
Re: C# SortedDictionary
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
OrderedDictionary можно заменить на Dictionary<object, object>

OrderedDictionary od = new OrderedDictionary();
od.Add(1, 1);
od.Add("Два", 2);
od.Add(3, "Три");
foreach (DictionaryEntry entry in od)
//foreach (var entry in od) // так нельзя!
{
Console.WriteLine(entry.Key + " " + entry.Value);
}
Dictionary<object, object> dictionary = new Dictionary<object, object>();
dictionary.Add(1, 1);
dictionary.Add("Два", 2);
dictionary.Add(3, "Три");
//foreach (KeyValuePair<object, object> entry in dictionary)
foreach (var entry in dictionary) // а так - можно
{
Console.WriteLine(entry.Key + " " + entry.Value);
}

Так что тут ошибки нет.



Исправлено 2 раз(а). Последнее : S-type, 26.04.17 10:11
Ratings: 0 negative/0 positive
Re: C# SortedDictionary
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Хотя, с другой стороны:

OrderedDictionary od = new OrderedDictionary();
od.Add(1, 1);
od.Add("Два", 2);
od[0] = 0;
foreach (DictionaryEntry entry in od)
{
Console.WriteLine(entry.Key + " " + entry.Value);
}
// 1 0
// Два 2
Dictionary<object, object> dictionary = new Dictionary<object, object>();
dictionary.Add(1, 1);
dictionary.Add("Два", 2);
dictionary[0] = 0;
foreach (var entry in dictionary)
{
Console.WriteLine(entry.Key + " " + entry.Value);
}
// 1 1
// Два 2
// 0 0

Т.е. называть Dictionary<object, object> обобщённой версией OrderedDictionary - наверное некорректно.



Исправлено 2 раз(а). Последнее : S-type, 26.04.17 10:36
Ratings: 0 negative/0 positive
Re: C# SortedDictionary
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Вообще, OrderedDictionary какой то странный. Хотя в названии есть Ordered, он ни какой не упорядочнный. На msdn.microsoft.com сказано

Цитата:
Элементы OrderedDictionary не сортируются по ключу

Почему Ordered - очень даже не понятно. Ещё сказано:

Цитата:
Можно обращаться к элементам, с помощью ключа или индекса.

Но, на сколько вижу, можно сделать так:

OrderedDictionary od = new OrderedDictionary();
od.Add(1, 1);
od.Add("Два", "Два");
for (int i = 0; i < od.Count; i++)
{
Console.WriteLine(od.ToString());
}
// 1
// Два

на msdn.microsoft.com приведён жуткий пример доступа, примерно так:

OrderedDictionary od = new OrderedDictionary();
od.Add(1, 1);
od.Add("Два", "Два");
ICollection keyCollection = od.Keys;
ICollection valueCollection = od.Values;
object[] myKeys = new object[od.Count];
object[] myValues = new object[od.Count];
keyCollection.CopyTo(myKeys, 0);
valueCollection.CopyTo(myValues, 0);
for (int i = 0; i < od.Count; i++)
{
Console.WriteLine(myKeys[i].ToString()+" "+ myValues[i].ToString());
}

IMHO, это сложно назвать "доступом с помощью ключа или индекса".

Вопрос - зачем вообще нужен OrderedDictionary? Это уже ненужный рудимент?



[i]Исправлено 1 раз(а). Последнее : S-type, 26.04.17 11:13
Ratings: 0 negative/0 positive
Re: C# SortedDictionary
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Ещё один косяк в таблице - не NameValuePair, а KeyValuePair.



Исправлено 1 раз(а). Последнее : S-type, 26.04.17 12:08
Ratings: 0 negative/0 positive
Re: C# SortedDictionary
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
По поводу OrderedDictionary. Вот так - работает "как надо":

OrderedDictionary od = new OrderedDictionary();
od.Add(1, 1);
od.Add("Два", "Два");
od[(object)0] = 0; // !
foreach (DictionaryEntry entry in od)
{
Console.WriteLine(entry.Key + " " + entry.Value);
}
// 1 1
// Два Два
// 0 0

И, доступ лучше получать не как в примере, а так:

foreach (Object name in od.Values) // перебор всех значений, если ключ не интересует
{
Console.WriteLine(name);
}
foreach (Object key in od.Keys) // перебор всех значений, если ключ нужен
{
Console.WriteLine(key+" "+od[key].ToString());
}
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 5 (Гостей: 5)

© 2000-2024 Fox Club 
Яндекс.Метрика