Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Hashtable в качестве значения Hashtable(хеш хешей)


Автор: tot 6.3.2009, 20:28
вот такой незатейливый код

Код

Hashtable currentDate = new Hashtable();
currentDate["links"] = new Hashtable();


как теперь обратится к вложенному хешу(добавить к пару)?

вот так выдает ошибку
Код

using System;
using System.Collections;
.......
currentDate["links"].Add("key", 1);
currentDate["links"].["key"] = 1;



можно конечно через временную переменную

Код

Hashtable t1 = (Hashtable)currentDate["links"];
t1.Add("key", 1);


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


Автор: Partizan 6.3.2009, 20:35
Код

((Hashtable)currentDate["links"])["key"] = 1;

Автор: source777 6.3.2009, 20:58
Hashtable вообще отвратно смотрится, как и любая нетипизированная коллекция, юзай Dictionary.

Автор: diadiavova 6.3.2009, 21:02
Ещё можно использовать System.Collections.Generic.Dictionary вместо Hashtable, тогда приведение типов не понадобится.

Автор: tot 7.3.2009, 01:09
Спасибо за помощь. Еще вопрос: как передать параметр по ссылке с одновременным преобразованием типов?

Код

App.myMethod(ref (Hashtable)Obj);


выдает ошибку

для обхода этого создаю лямбда функцию

Код

Func<Object, Hashtable> toHash = obj => (Hashtable)obj;

App.myMethod(ref toHash(Obj));


наверняка можно как то проще

Автор: mihryak 7.3.2009, 01:50
класс по ссылке? зачем?
он уже reference (ссылочный) тип, а ref полезен для value-types (типов-значений), без него передаётся не экземпляр, а его копия

и, как уже заметили, всё прогрессивное человечество использует дженерики, то, что ты успел подружиться с Hashtable, не оправдывает отказ от строгой типизации, тем более при использовании дженериков вопрос о приведении типа вообще не возникнет

Автор: QryStaL 7.3.2009, 13:51
Цитата(mihryak @  7.3.2009,  01:50 Найти цитируемый пост)
класс по ссылке? зачем?он уже reference (ссылочный) тип, а ref полезен для value-types (типов-значений)


Ошибаетесь, ref полезен и для ссылочных типов.

Автор: mihryak 7.3.2009, 16:56
Цитата(QryStaL @  7.3.2009,  14:51 Найти цитируемый пост)
Ошибаетесь, ref полезен и для ссылочных типов. 

можно пример? его можно использовать и для ссылочных типов (поэтому и написал "зачем?", а не "так нельзя"), но в голову ничего некривого не приходит

Автор: source777 7.3.2009, 18:16
Цитата(mihryak @  7.3.2009,  16:56 Найти цитируемый пост)

можно пример? 

Легко, стандартный пример:
Код

public void Swap<T>(ref T a, ref T b)
{
  T t = a;
  a = b;
  b = t;
}


Вообще, при применении модификатора ref для параметров ссылочных типов в метод передаётся не ссылка на объект, а ссылка на ссылку на объект, что позволяет не только менять поля объекта, но и изменить значение самой ссылки. Подробнее читай http://msdn.microsoft.com/ru-ru/library/s6938f28.aspx.

Автор: -Mikle- 7.3.2009, 18:35
Цитата(mihryak @  7.3.2009,  19:56 Найти цитируемый пост)
можно пример?


Еще пример (более наглядный):
Код

public void test()
{
    Class1 ddd = new Class1();
    ddd.Field1 = 123;

    Replace(ref ddd);

    // ddd ссылается уже на новый экземпляр, созданный в методе Replace
    // ddd.Field1 будет иметь значение 777
}

public void Replace(ref Class1 cls)
{
    cls = new Class1();
    cls.Field1 = 777;
}

Автор: mihryak 7.3.2009, 19:39
Цитата(-Mikle- @  7.3.2009,  19:35 Найти цитируемый пост)
Еще пример (более наглядный):

Зачем этот код может понадобиться? Я прекрасно понимаю, что он делает, - но зачем?

Цитата(source777 @  7.3.2009,  19:16 Найти цитируемый пост)
позволяет не только менять поля объекта, но и изменить значение самой ссылки

Я это тоже знаю, со swap'ом согласен, в сортировках порой применяется и в .... а где ещё?

Но, право слово, за всё время, что занимаюсь программированием, мне ни разу не требовалось изменять ссылку переданного объекта.
В то же время, регулярно вижу код, где используют ref в тех местах, где он вообще не нужен или без него код выглядел бы более красивым.
В моём понимании, параметр либо входной, либо выходной (давайте без интеропов всяких это прочитаем).
Даже к out отношусь крайне скептически - то ещё уродство, но в некоторых случаях без него никак.

Автор: PashaPash 8.3.2009, 12:58
mihryak, TryGet/TryParse?

Автор: mihryak 8.3.2009, 13:30
Цитата(PashaPash @  8.3.2009,  13:58 Найти цитируемый пост)
TryGet/TryParse

угу, это как раз те моменты, когда без out реализация гораздо хуже, но ведь не refже

Автор: Partizan 8.3.2009, 14:52
Модератор: От сути топика слишком отошли

Автор: tot 9.3.2009, 12:10
да уж, очень сильно отошли от темы. По поводу то что классы передаются по ссылке понял, спасибо. 
Но на будущее как же передать ссылку на ссылку? 

Автор: PashaPash 9.3.2009, 21:08
tot, просто в 2 строчки, без лямбды, не комильфо?
Код

Hashtable hashtable = (Hashtable)Obj;

myMethod(ref hashtable);

ref-у нужна присвоябельная переменная, а результату каста - оператора () - присвоить что-то не всегда получится. Потому что вернуть () может все что угодно, а не просто оригинальную ссылку с нужным типом. И обратное преобразование не всегда возможно. Смотри:
Код

class A
{
    public static explicit operator A(B b)
    {
        return new A();
    }
}

class B
{

}
static void Main(string[] args)
{
    B b = new B();
    object a = (A)b;

    Console.WriteLine(Object.ReferenceEquals(a, b));  // false
}

Теперь представь, что результат (A)b ты передаешь как параметр ref A. Куда компилятор дожен положить возвращаемое значение? В переменную B b?

Автор: tot 10.3.2009, 19:09
Цитата(PashaPash @ 9.3.2009,  21:08)
tot, просто в 2 строчки, без лямбды, не комильфо?

Лишняя строчка стройность кода портит, думал что возможно решить проблему изящнее. 
Но если больше нет других вариантов то остается только так.

Автор: PashaPash 10.3.2009, 19:22
Цитата(tot @  10.3.2009,  19:09 Найти цитируемый пост)
Лишняя строчка стройность кода портит

код с ref (Hashtable)obj уже ничем не испортишь smile

Автор: mihryak 10.3.2009, 19:24
прошу прощения за навязчивость
выше уже высказывал мнение, что ref и hashtable не способствуют стройности ни разу

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)