Как я могу создать последовательность пронумерованных переменных во время выполнения?

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

Пока все хорошо... Но мне также нужно, чтобы имя каждой локальной переменной соответствовало очень определенному образцу: имя должно начинаться с "oArr", за которым следует одна или несколько цифр, отражающих положение этого конкретного массива в последовательности. Кроме того, во время компиляции я не буду знать, сколько таких массивов и, следовательно, сколько локальных переменных мне понадобится!

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

int i=0;
foreach(something)
{
    ArrayList oArr+i=new ArrayList();
    i++;
}

...и превратить его во что-то, что соответствует критериям, изложенным выше, и действительно компилируется?

С другой стороны, есть ли более простой и разумный подход к этой проблеме?


person SunilRai86    schedule 01.07.2010    source источник
comment
Вы предоставили недостаточно информации, чтобы мы могли вам помочь.   -  person ChaosPandion    schedule 01.07.2010
comment
Чего вы пытаетесь достичь, изменяя имя переменной?   -  person Carlos G.    schedule 01.07.2010
comment
Ах, старый шаблон переменной без ссылок! Остерегайтесь, многие решения этой проблемы приводят к предсказуемым именам переменных, что позволяет опытным клиентам ссылаться на переменную, используя переменную, содержащую меняющееся имя переменной... Чтобы избежать этого, либо используйте надежный внешний источник истинных случайных значений, либо обязать клиентов использовать различные имена переменных для переменных, содержащих их различные значения имен переменных переменных.   -  person Shog9    schedule 01.07.2010
comment
@ Shog9 - мне пришлось прочитать это 3 раза...   -  person ChaosPandion    schedule 01.07.2010
comment
C# 4 и ArrayList немного странные. Если вы используете C# 2 или новее, вы должны использовать List<T> вместо ArrayList.   -  person Brian Rasmussen    schedule 01.07.2010
comment
(Между прочим, я подозреваю, что это именно то, что наполняет кошмары пользователей C#, которые все еще беспокоятся о добавлении поддержки типа dynamic в C# 4.0...)   -  person Shog9    schedule 01.07.2010


Ответы (3)


Вы не можете изменить имя переменной во время выполнения, так как код (даже код C#) был скомпилирован с определенным именем переменной. Если бы вы могли изменить имя во время выполнения, это вызвало бы проблемы.

Например, если язык позволяет изменять имена переменных, то когда вы пытаетесь получить доступ к переменной с именем «var1», компилятор не знает, изменилось ли во время выполнения это имя переменной и теперь называется «x».

Что-то, что вы могли бы попытаться сделать, это позволить вашей программе динамически компилировать некоторый код, но это, вероятно, не правильное решение вашей проблемы. Если вы объясните лучше, что вам нужно, мы могли бы предоставить вам эффективное решение.

Надеюсь, это помогло

РЕДАКТИРОВАНИЕ: Глядя на ваши издания, я могу сказать вам, что это невозможно с подходом, который вы сейчас используете. Я мог бы предложить вам следующее:

int i = 0;
List<ArrayList> masterList = new List<ArrayList>();
foreach (something)
{
     masterList.Add(new ArrayList());
     i++;
}

Если вам нужно, чтобы каждый ArrayList имел определенное имя, которое вы можете вспомнить, вы можете использовать словарь:

int i = 0;
Dictionary<string, ArrayList> masterList = new Dictionary<string, ArrayList>();
foreach (something)
{
     masterList.Add("oArr" + i.ToString(), new ArrayList());
     i++;
}
ArrayList al = masterList["oArr1"];
person Carlos G.    schedule 01.07.2010

Будет ли это работать для вас?

var arrayLists = new List<ArrayList>();
var i = 0;
foreach(var item in list)
{
    arrayLists.Add(new ArrayList());
    i++;
}

Затем вы можете получить доступ к каждому списку массивов по индексу.

person ChaosPandion    schedule 01.07.2010

Используйте список ArrayLists.

person Falmarri    schedule 01.07.2010