Конференция ".Net" » Есть ли в C# массивы с индексакцией на базе перечислимых типов?
 
  • kaif © (23.10.07 13:55) [0]
    Или это чисто паскалевская штучка?
    Я имею в виду массивы вроде:
    //======================
    type
     TCarType = (ctLada, ctVAZ, ctAudi, ctMers, ctBMW, ctToyota, ctRenault);
    var
     MyArray: array[TCarType ] of <something>;
    //======================



    В C# перечислимый тип можно задать в частности так:

       
       public enum CarType: int
       {
         Lada = 1,
         VAZ = 2,
         Audi =3,
         Mers = 4,
         BMW = 5,
         Toyota = 6,
         Renault = 7
       }




    А вот как бы создать на его базе массив, я не нашел.
    Может быть плохо искал?...
  • clickmaker © (23.10.07 13:57) [1]
    если члены енума монотонно возрастают, то чем это отличается от обычного индекса? только с нуля надо начинать
  • Игорь Шевченко © (23.10.07 14:01) [2]

    > А вот как бы создать на его базе массив, я не нашел.


    А вроде никак
  • Alkid © (23.10.07 14:02) [3]
    Юзай Hashtable или Dictionary - они для этого и нужны.
  • kaif © (23.10.07 14:12) [4]
    2 Игорь Шевченко ©
    То есть мне не показалось.
    Я просто переводил здесь один компонент с Delphi на C# и обнаружил этот изъян C# (или преимущество Pascal).
    Так как в C# типы индексов вообще не оговариваются программистом (всегда подразумевается, что они целые и начинаются с нуля), то видимо невозможно получить свое ограничение на тип индекса в C#. Такое, чтобы компилятор требовал от выражения A[b], чтобы b было типа CarType или явно приведено к нему A[(CarType)b]
  • kaif © (23.10.07 14:15) [5]
    2 Alkid ©   (23.10.07 14:02) [3]
    Да я-то обошел эту проблему. Просто хотелось уточнить. Перечислимые типы в C# мне понравились, они не хуже паскалевских. И массивы по своим возможностям не хуже. Но вот эта негибкость в отношении индексации (фактическое отсутствие управления типом индекса) несколько испортила впечатление.
  • Игорь Шевченко © (23.10.07 14:28) [6]
    kaif ©   (23.10.07 14:12) [4]


    > То есть мне не показалось.


    Да, мы два года назад сталкивались с аналогичной проблемой, пытаясь синхронизировать перечислимый тип с некими его атрибутами (гуманным строковым представлением, еще чем-то).
  • TUser © (23.10.07 20:14) [7]
    Си изначально - язык "пониженного" уровня. Он создан техническими инженерами для технических инженеров. Там не должно быть столь высокоуровневых абстракций.

    А Вирт хотел сделать язык, на котором можно программировать так же, как я бы объяснял на русском языке алгоритм, а не думать об устройстве процессора, и о том знает ли он мой перечисляемый тип. Имхо.
  • Галинка © (23.10.07 23:28) [8]
    тест
  • Галинка © (23.10.07 23:33) [9]
    Т.е. вы хотите сказать, что в Дельфи можно было создать массив с индексами, основанными на перечислении? Т.е. если имеем перечисление, как у автора, то получаем массив индексируемый с единицы?

    Но как же тогда быть, с тем что в шарпе строго говоря, можно задавать любые значения элементам перечисления? Как тогда на этом можно осуществлять индексирование массива? Если объявлено перечисление
    public enum DampfTemp : int
    {
       Cels = 100,
       Faring = 212
    }



    то как на его основе сделать индексы массива?
  • Игорь Шевченко © (24.10.07 10:32) [10]

    > Т.е. вы хотите сказать, что в Дельфи можно было создать
    > массив с индексами, основанными на перечислении? Т.е. если
    > имеем перечисление, как у автора, то получаем массив индексируемый
    > с единицы?


    То есть, Delphi ты тоже не знаешь.

    Массив индексируемый перечислимым типом начинается с Low(EnumerableType) и заканчивается High(EnumerableType)
  • b z (25.10.07 11:18) [11]

    > можно задавать любые значения элементам перечисления

    более того, тут есть возможность использование необъявленного значения, например, позволяющая добавлять в enum новые значения, и при этом не перекомпилировать сборки, использующие предыдущие версии, при передачи параметра и ...
  • vpbar © (25.10.07 11:25) [12]
    >>Галинка ©   (23.10.07 23:33) [9]
    Ну например так
    int[DampfTemp] ar;
    обращатся как ar[Cels] ar[Faring]
    Или вас интересует как это будет транслироватся компилятором?
    Так это его проблемы, имхо. Иногда я не хочу бумать о машинных кодах, а работать на более высоком уровне абстрации
  • Galinka © (26.10.07 22:17) [13]
    vpbar ©   (25.10.07 11:25) [12]

    нет. Меня интересует конкретный прецедент:

    public enum{
      TempCels = 100,
      TempFaring = 212
    }

    как на основе этого можно создать индекс массива? Массив вроде всегда с нуля. Или для этого будут элементам enum будут присвоены какие-то значения по умолчанию?
  • Galinka © (26.10.07 22:28) [14]
    Игорь Шевченко ©   (24.10.07 10:32) [10]

    не пришлось сталкиваться. Я вообще с массивами фиксированной длины мало имела опыта. В основном все как-то то файлы парсить надо было, то еще что, когда заранее не известно, сколько элементов массива надо. А потом для облегчения понимания стала чаще использовать структуры. Даже если только из однородных полей структура (запись то есть), то все равно есть более удобный механизм достучаться до конкретного элемента-поля, а не сидеть и не вспоминать. какой у него индекс должен быть (((
  • Galinka © (26.10.07 22:42) [15]
    пардон. 13 снимается. Т.е. это есть своего рода уход от (создающих трудности) цифровых индексов. А значения, которые присвоены элементам перечисления роли не играют, хоть -10 и 25683. Все равно получится массив из двух элементов.

    тогда может есть способ как-то вывернуться через typedef? Ну там определяешь запись, и что туда подставляется. Ведь как-то же это в дельфи реализовано?
  • clickmaker © (29.10.07 10:28) [16]

    > хоть -10 и 25683. Все равно получится массив из двух элементов

    Hashtable
  • ferr (02.11.07 13:28) [17]
    > Hashtable

    устарел.
    Dictionary, SortedDictionary, SortedMap.
  • ferr (02.11.07 13:29) [18]
    > SortedMap.

    наверное всё-таки SortedList =)
  • clickmaker © (02.11.07 14:25) [19]

    > [17] ferr   (02.11.07 13:28)
    > > Hashtable
    >
    > устарел.

    Public Class Hashtable
    Implements IDictionary,

    к тому же, не все еще под .net 2 работают
 
Конференция ".Net" » Есть ли в C# массивы с индексакцией на базе перечислимых типов?
Есть новые Нет новых   [118582   +31][b:0][p:0.001]