Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hashtable в качестве значения Hashtable(хеш хешей) 
V
    Опции темы
tot
Дата 6.3.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 25.12.2007

Репутация: нет
Всего: нет



вот такой незатейливый код

Код

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);


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


PM MAIL   Вверх
Partizan
Дата 6.3.2009, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



Код

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



--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
source777
Дата 6.3.2009, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 3
Всего: 56



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


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
diadiavova
Дата 6.3.2009, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
tot
Дата 7.3.2009, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 25.12.2007

Репутация: нет
Всего: нет



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

Код

App.myMethod(ref (Hashtable)Obj);


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

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

Код

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

App.myMethod(ref toHash(Obj));


наверняка можно как то проще
PM MAIL   Вверх
mihryak
Дата 7.3.2009, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



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

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

Это сообщение отредактировал(а) mihryak - 7.3.2009, 01:52
PM MAIL ICQ   Вверх
QryStaL
Дата 7.3.2009, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 10
Всего: 32



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


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


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
mihryak
Дата 7.3.2009, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



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

можно пример? его можно использовать и для ссылочных типов (поэтому и написал "зачем?", а не "так нельзя"), но в голову ничего некривого не приходит
PM MAIL ICQ   Вверх
source777
Дата 7.3.2009, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 3
Всего: 56



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

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

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

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


Вообще, при применении модификатора ref для параметров ссылочных типов в метод передаётся не ссылка на объект, а ссылка на ссылку на объект, что позволяет не только менять поля объекта, но и изменить значение самой ссылки. Подробнее читай тут.

Это сообщение отредактировал(а) source777 - 7.3.2009, 18:24


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
-Mikle-
Дата 7.3.2009, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 4
Всего: 59



Цитата(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;
}



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
mihryak
Дата 7.3.2009, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



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

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

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

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

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

Это сообщение отредактировал(а) mihryak - 7.3.2009, 19:43
PM MAIL ICQ   Вверх
PashaPash
Дата 8.3.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



mihryak, TryGet/TryParse?


--------------------
PM MAIL WWW   Вверх
mihryak
Дата 8.3.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



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

угу, это как раз те моменты, когда без out реализация гораздо хуже, но ведь не refже
PM MAIL ICQ   Вверх
Partizan
Дата 8.3.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



Модератор: От сути топика слишком отошли


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
tot
Дата 9.3.2009, 12:10 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 25.12.2007

Репутация: нет
Всего: нет



да уж, очень сильно отошли от темы. По поводу то что классы передаются по ссылке понял, спасибо. 
Но на будущее как же передать ссылку на ссылку? 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0983 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.