2014-02-13 2 views
1
p1.Contains(listname[i, 0]); 

p2.Contains(listname[i, 0]); 

Есть ли способ заменить p1 и p2 и вместо этого использовать переменную. Я хочу сделать что-то вродеКак использовать динамическое имя списка?

"p" + variableName.Contains(listname[i, 0]); 

Это не работает.

Может кто-нибудь сказать мне, как я могу сделать эту работу?

+2

Что такое p1 и p2? – BlackBear

+0

Дайте нам большую картинку: чего вы пытаетесь достичь? – dcastro

+5

Далеко не очевидно, чего вы пытаетесь достичь здесь, но если вы хотите ссылаться на локальные переменные на строковое представление своего «имени», вам, вероятно, лучше хранить свои списки в строке «Словарь <строка», список > '. –

ответ

1

Вы можете сделать массив p вместо объявления нескольких переменных. Предполагая, что p1 и p2 являются строками.

P []p = new P[10]; 

for(int i = 0; i < p.Length; i++) 
    p[i].Contains(listname[i, 0] 

Было бы лучше, если вы можете использовать List

List<P> p = new List<P>(); 

for(int i = 0; i < p.Length; i++) 
    p[i].Contains(listname[i, 0] 

Редактировать базу на комментарии, p1 и p2 сборники

var p = new ICollection[2]; 
List<P> p1 = new List<P>(); 
List<P> p2 = new List<P>(); 
p[0] = p1; 
p[1] = p2; 

p[variableContainZeroOrOne].Contains(listname[i, 0]  
+0

У меня есть одна переменная, которая меняется с каждым поворотом 1-2 и 2-1, не представляется возможным поставить ее как «p» + имяПеременный. – user3305851

+0

Вам лучше заменить переменную массивом – Adil

+1

@ user3305851 Нет. Это невозможно. – nos

0

Создать функцию, которая принимает список как параметр.

public bool doSomething (List list, int i) 
{ 
    bool test = list.Contains(listname[i, 0]); 
    return test; 
} 
+0

Вы должны объяснить, что он должен создать новый список и добавить его 'p1',' p2', 'p3' в этот новый список. – nos

3

Используйте массив или хеш-таблицу.

var p = new ICollection[2]; 
p[0] = p0; 
p[1] = p1; 
... 
p[your_variable].Contains(listname[i,0]); 

Вы не можете получить доступ к переменным по их именам, так как их имена не сохраняются во время выполнения, например. CLR не имеет возможности найти значение переменной «p1».

0

Просто создайте переменную типа List и назначьте ей правильный список. Используйте эту переменную в остальной части кода ...

0

Если у вас есть переменные p1, p2 и вы хотите ссылки их, используя номер, а затем:

Решение 1, создать вспомогательный метод

string PX(int number) 
{ 
    switch(number) 
    { 
     case 1: return p1; 
     case 2: return p2; 
    } 

    // or 
    if(number == 1) return p1; 
    if(number == 2) return p2; 
} 

// usage 
PX(x).Contains(blablabla); 

Solution 2, использование индексов

// helper array 
string[] px = new string[] {p1, p2}; 
// usage 
px[i - 1].Contains(blablabla); 

или

// helper array 
string[] px = new string[] {null, p1, p2}; 
// usage 
px[i].Contains(blablabla); 

Решение 3, используйте коллекции ключей.

Решение 4, используйте отражение.

Решения 3 и 4 более медленные и с излишними накладными расходами. Индексы быстры, имеющие вспомогательный метод или вспомогательный массив не слишком много, рассмотрим следующие свойства при построении

private string[] _px = string[2]; 
public string[] PX { get { return px; } } 
public string P1 
{ 
    get { return _px[0]; } 
    set { _px[0] = value; } 
} 
public string P2 
{ 
    get { return _px[1]; } 
    set { _px[1] = value; } 
} 

Таким образом, данные сначала сохраняются в массиве = вы не тратите память, имея при этом возможность доступа к значениям по индекс PX[index] или по названию P1/P2.

+0

Есть ли способ сделать это со списками? – user3305851

+0

замените 'string' на' List' (я взял 'string', потому что знаю метод' string.Contains') – Sinatr

+0

У меня есть два разных списка: один для p1 и другой для p2 p1.add (12) и p2.add (11) то, что я хочу сделать, это p [variable] .add (value), переменная должна указывать, какой список добавить. – user3305851

Смежные вопросы