C#, как обработать постоянные таблицы

Как привычка, Всегда ОБЪЕДИНЕНИЕ использования ВЕСЬ . Используйте только ОБЪЕДИНЕНИЕ в особых случаях, когда необходимо устранить дубликаты, которые могут быть чрезвычайно грязными, и можно считать все о в других комментариях здесь.

7
задан Loren Pechtel 4 September 2009 в 00:51
поделиться

6 ответов

В часто задаваемых вопросах по C # есть страница об этой конкретной вещи.

Они предлагают использовать статический массив только для чтения:

static readonly int[,] constIntArray = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }};

Однако имейте в виду, что это всего лишь своего рода константа - вы все равно можете переназначать отдельные элементы в массиве. Кроме того, это должно быть указано на уровне класса, поскольку оно статическое, но оно будет работать достаточно хорошо.

2
ответ дан 7 December 2019 в 07:48
поделиться
3
ответ дан 7 December 2019 в 07:48
поделиться

Конечно, перечисления.

0
ответ дан 7 December 2019 в 07:48
поделиться

Что ж, я использовал следующий подход: немного неприятно читать, но легко редактировать.

    public struct Something
    {
        public readonly int Number;
        public readonly string Name;
        public Something(int num, string name) { this.Number = num; this.Name = name; }
    }

    public readonly Something[] GlobalCollection = new Something[] 
    {
        new Something(1, "One"),
        new Something(2, "Two"),
    };
0
ответ дан 7 December 2019 в 07:48
поделиться

Вы можете использовать Hashtable только для чтения. Единственным недостатком является то, что только чтение не мешает вам изменять значение определенного элемента в Hashtable. Так что это не совсем константа.

readonly Hashtable table = new Hashtable(){{1,"One"},{2,"Two"}};

Или массив

public readonly string[,] arry = new string[,]{{"1","2"},{"2","4"}};

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

1
ответ дан 7 December 2019 в 07:48
поделиться

Как они говорят, просто добавьте еще один уровень косвенности. В C # нет необходимости предоставлять специализированную структуру данных в качестве языкового примитива, хотя иногда хочется, чтобы был способ сделать любой класс неизменяемым, но это уже другое обсуждение.

Теперь вы не упомянули, если вы нужно хранить там разные вещи. Фактически, вы не упомянули ничего, кроме многомерного и никакой возможности изменять значения или массивы. Я даже не знаю, подходит ли шаблон доступа (единственный индексатор int, int, int).

Но в целом для трехмерного массива с зубчатыми краями работает следующее (но это не очень красиво).

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

public static readonly ReadOnlyThreeDimensions<int> MyGlobalThree 
    = new ReadOnlyThreeDimensions<int>(IntInitializer);

public class ReadOnlyThreeDimensions<T> 
{
    private T[][][] _arrayOfT;

    public ReadOnlyThreeDimensions(Func<T[][][]> initializer)
    {
        _arrayOfT = initializer();
    }

    public ReadOnlyThreeDimensions(T[][][] arrayOfT)
    {
        _arrayOfT = arrayOfT;
    }

    public T this [int x, int y, int z]
    {
        get 
        {
            return _arrayOfT[x][y][z];
        } 
    }
}

И тогда вам просто нужно предоставить какой-нибудь метод инициализатора или назначить его в статическом конструкторе.

public static int[][][] IntInitializer()
{
    return xyz // something that constructs a [][][]  
}
1
ответ дан 7 December 2019 в 07:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: