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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> дурацкая работа с массивом 
:(
    Опции темы
Fyrklod
Дата 6.10.2007, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



не уверен, что правильно щас говорю.....но...  
можно ли сделать индексатор в классе так чтобы к массиву обращаться не по индексу типа int , а по имени, т.е. masiv["name1"], masiv["name2"]
заранее прошу не ругаться, если это глупость
--------------------
Зачем компьютеры пищат, когда нажимаешь сразу много клавиш? Чтобы будить уснувших на клавиатуре программистов!
PM MAIL   Вверх
marcusmae
Дата 6.10.2007, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Почему нет?

Код

class Masiv
{
    private int[] masivValues;

    public int this[string name] {
        get {
            // здесь по-совему установи соответствие между строками и целыми индексами
            return this.masivValues[Convert.ToInt32(name)];
        }
        set { 
            this.masivValues[Convert.ToInt32(name)] = value;
        }
    }

    ...

    // конструктор
    public Masiv(int size) { this.masivValue = new int[size]; }
}


Теперь можно создать экземпляр такого крокодила и кормить строками :

Код

Masiv masiv = new Masiv(10);

masiv["9"] = 20;
Console.WriteLine(masiv["9"]);


Это сообщение отредактировал(а) marcusmae - 6.10.2007, 20:58


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
tol05
Дата 6.10.2007, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

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



Вместо Convert.ToInt32(name) лучше использовать Int32.Parse(name) (потому как эта реализация введена не в постороннем к строкам и числам классе Convert, а внутри самого Int, т.е. более оптимальный алгоритм)
А еще лучше использовать Int32.TryParse (name, out result) ибо если строка не приведется к int, то выбросится исключение, которое никто (как я посмотрел) обрабатывать не собирался.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
marcusmae
Дата 6.10.2007, 21:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Цитата(tol05 @  6.10.2007,  21:16 Найти цитируемый пост)
А еще лучше использовать Int32.TryParse (name, out result) ибо если строка не приведется к int, то выбросится исключение, которое никто (как я посмотрел) обрабатывать не собирался.

Согласен, спасибо. В любом случае это - лишь пример, поскольку я не знаю, что Fyrklod собирается делать со строками, передаваемыми индексатору.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
mr.DUDA
Дата 6.10.2007, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Вообще, скорее всего имелось ввиду "как сделать доступ по имени" а не по индексу. В таком случае парсить ничего не надо, вместо этого заводим в классе поле с типом Dictionary<string, bla-bla-bla>, где "bla-bla-bla" - элемент массива, в терминах Fyrklod. А в get/set индексатора помещаем простейшую фигню типа получить/присвоить элемент Dictionary по строковому ключу.


--------------------
user posted image
PM MAIL WWW   Вверх
marcusmae
Дата 6.10.2007, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Цитата(mr.DUDA @  6.10.2007,  22:47 Найти цитируемый пост)
заводим в классе поле с типом Dictionary<string, bla-bla-bla>, где "bla-bla-bla" - элемент массива, в терминах Fyrklod


Ха, ну если так, то можно использовать в чистом виде generic-словарь Dictionary<string, T>, где T - требуемый тип. Словарь и так уже имеет индексатор по ключу, то есть по именам smile

Подробнее можно посмотреть в MSDN.



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
mr.DUDA
Дата 7.10.2007, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Хотелось бы услышать автора топика, что он думает по данному вопросу.  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Fyrklod
Дата 7.10.2007, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



всем спасибо
--------------------
Зачем компьютеры пищат, когда нажимаешь сразу много клавиш? Чтобы будить уснувших на клавиатуре программистов!
PM MAIL   Вверх
Fyrklod
Дата 7.10.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Данный вопрос поднимался для того чтобы доказать кое-кому что такое возможно smile хотя и для себя стало более познавательно... может все таки и применю этот метод о котором написал mr.DUDA. И хотел бы попросить, нельзя ли более подробнее что-то написать, вплодь для исходника чтбы лучше разобраться в этом
--------------------
Зачем компьютеры пищат, когда нажимаешь сразу много клавиш? Чтобы будить уснувших на клавиатуре программистов!
PM MAIL   Вверх
mr.DUDA
Дата 7.10.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



пожалуйста:

Код
public class A
{
   // ... здесь что угодно

   Dictionary<string, float> _nameToFloat = new Dictionary<string, float>();

   public float this[string name]
   {
         get { return _nameToFloat[name]; }
         set { _nameToFloat[name] = value; }
   }

   // ... и тут тоже что угодно
}



--------------------
user posted image
PM MAIL WWW   Вверх
GavriKos
Дата 7.10.2007, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А нельзя еще проще? В С кажется можно было использовать любые перечисляемые типы как индексы массива. Т.е. в теории можно юзать и char. Не знаю, насколько это работало, но вот возможно ли в c# такое?
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
marcusmae
Дата 7.10.2007, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



GavriKos, нет. Даже в случае перечислений (enum) понадобится явное приведение типов. Но явно привести можно пробовать любой тип, char в частности :
Код

int index = Convert.ToInt32('a'); // 97

Однако, есть такая штука, как явные и неявные операторы приведения - см. MSDN. Оттуда же можно понять, по какой причине эти неявные приведения не определены по умолчанию для втроенных типов :

Цитата

By eliminating unnecessary casts, implicit conversions can improve source code readability. However, because implicit conversions can occur without the programmer's specifying them, care must be taken to prevent unpleasant surprises. In general, implicit conversion operators should never throw exceptions and never lose information so that they can be used safely without the programmer's awareness. If a conversion operator cannot meet those criteria, it should be marked explicit


Это сообщение отредактировал(а) marcusmae - 7.10.2007, 22:55


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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