Как инициализировать константу массива, указав нужные индексы - PullRequest
4 голосов
/ 24 августа 2010

Я просто хочу инициализировать константу массива string [], указав не только значения, но и индексы, к которым они будут присоединены.

Например, на:

приватная статическая строка только для чтения [] Pets = новая строка [] {"Bulldog", "GreyHound"};

Я хотел бы заявить, что BullDog соответствует индексу 29, а GreyHound - 5 (как php :))

Есть предложения?

Приветствия

Ответы [ 6 ]

7 голосов
/ 24 августа 2010

Если у вас есть некоторая гибкость в отношении вашей структуры данных, было бы более эффективно использовать Dictionary<int, string> вместо массива для этого поведения.

Пример (если вы используете C # 3 или выше):

var pets = new Dictionary<int, string> {
    { 29, "Bulldog" },
    { 5, "Greyhound" }
};
Console.WriteLine(pets[5]);

Тот же пример для устаревших приложений:

Dictionary<int, string> pets = new Dictionary<int, string>();
pets[29] = "Bulldog";
pets[5] = "Greyhound";
Console.WriteLine(pets[5]);
6 голосов
/ 24 августа 2010

Звучит так, будто вы не хотите массив, но вместо него Dictionary<int, string>, который можно инициализировать так:

private static readonly Dictionary<int, string> pets = 
    new Dictionary<int, string> {
    { 29, "Bulldog" },
    { 5, "Greyhound" }
};

(Обратите внимание, что этот синтаксис инициализатора коллекции был добавлен только в C # 3. Если вы используете старую версию, вам придется вызывать Add или индексатор явно несколько раз.)

Вы можете получить доступ к словарю через indexer , который выглядит как доступ к массиву:

string x = pets[29];
pets[10] = "Goldfish";
1 голос
/ 24 августа 2010

Кстати, я согласен со всеми, что Dictionary, вероятно, более уместно.Но вы можете написать небольшой метод, чтобы осуществить то, что вы хотите:

public static T[] CreateArray<T>(params Tuple<int, T>[] values)
{
    var sortedValues = values.OrderBy(t => t.Item1);

    T[] array = new T[sortedValues.Last().Item1 + 1];

    foreach(var value in sortedValues)
    {
        array[value.Item1] = value.Item2;
    }

    return array;
}

И назвать его так:

string[] myArray = CreateArray(new Tuple<int, string>(34, "cat"), new Tuple<int, string>(12, "dog"));

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

Это хорошая идея?Почти наверняка нет, но я оставлю это на усмотрение ОП.

1 голос
/ 24 августа 2010

Я не думаю, что то, что вы хотите, возможно в C # при объявлении массивов.

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

private enum Pets
{
   [Description("GreyHound")]
   Greyhound = 5,
   [Description("Bulldog")]
   Bulldog = 29
}
0 голосов
/ 24 августа 2010

Вы не можете сделать это в инициализаторе, вам нужно сначала указать размер массива, а затем добавить элементы в определенных местах.

private static readonly string[] Pets = new string[42];

и затем в статическом конструкторе вы вставляете свои элементы.

private static MyClass
{
    Pets[29] = "Bulldog";
    Pets[5] = "Greyhound";
}

Но, как другие предложили: используйте Dictionary<int, string>.

0 голосов
/ 24 августа 2010

Вам не нужен строковый массив, но вместо этого Dictionary.

Взгляните на текст ссылки , там есть прекрасный пример (который я здесь адаптировал):

Dictionary<int, string> d = new Dictionary<int, string>();
        d.Add(2, "cat");
        d.Add(1, "dog");
        d.Add(0, "llama");
        d.Add(-1, "iguana");
...