Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > дурацкая работа с массивом


Автор: Fyrklod 6.10.2007, 20:29
не уверен, что правильно щас говорю.....но...  
можно ли сделать индексатор в классе так чтобы к массиву обращаться не по индексу типа int , а по имени, т.е. masiv["name1"], masiv["name2"]
заранее прошу не ругаться, если это глупость

Автор: marcusmae 6.10.2007, 20:57
Почему нет?

Код

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

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

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

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

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

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


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

Подробнее можно посмотреть в http://msdn2.microsoft.com/en-us/library/xfhwa508.aspx.

Автор: mr.DUDA 7.10.2007, 10:59
Хотелось бы услышать автора топика, что он думает по данному вопросу.  smile 

Автор: Fyrklod 7.10.2007, 14:26
всем спасибо

Автор: Fyrklod 7.10.2007, 15:16
Данный вопрос поднимался для того чтобы доказать кое-кому что такое возможно smile хотя и для себя стало более познавательно... может все таки и применю этот метод о котором написал mr.DUDA. И хотел бы попросить, нельзя ли более подробнее что-то написать, вплодь для исходника чтбы лучше разобраться в этом

Автор: mr.DUDA 7.10.2007, 17:41
пожалуйста:

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

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

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

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

Автор: GavriKos 7.10.2007, 20:13
А нельзя еще проще? В С кажется можно было использовать любые перечисляемые типы как индексы массива. Т.е. в теории можно юзать и char. Не знаю, насколько это работало, но вот возможно ли в c# такое?

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

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

Однако, есть такая штука, как явные и неявные операторы приведения - см. http://msdn2.microsoft.com/en-us/library/z5z9kes2(VS.71).aspx. Оттуда же можно понять, по какой причине эти неявные приведения не определены по умолчанию для втроенных типов :

Цитата

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

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