2016-12-15 2 views
0

У меня есть строка myString, которая может содержать переменное число пар, разделенных запятыми, например: «a = 1, b = 2, c = 3» или «c = 5, b = 4 "или" t = 12 ". У меня также есть целочисленные переменные с именем a, b, c, ..., z, все установлены в 0. Я хочу проанализировать myString и присвоить значения из строки каждой переменной. Я могу только сделать неэффективный способ сделать это, используя switch и case (т. Е. Если myString содержит «a», извлеките значение «a» и назначьте его переменной с именем «a»). Любые идеи о том, как написать лучший код для этой операции?Назначение значений для нескольких переменных

void Test(string myString) 
    { 
     int a, b, c, d; 
     a = b = c = d = 0; 
     string[] varNames = {"a", "b", "c", "d"}; 
     for(int i = 0; i < varNames.Length; i++) 
     { 
      if(myString.IndexOf(varNames[i]) >= 0) 
      { 
       VariableWhoseNameIs(varNames[i]) = 3; 
      } 
     } 
    } 
+0

Спасибо, я забыл об этом. Я только что добавил. –

+0

Итак, если ваша строка содержит «x = 14», например, вы хотите назначить 14 вашей переменной x? – Martheen

+2

Нужно ли иметь отдельные переменные? Похоже, что имеет смысл хранить результаты в словаре «», поскольку они являются парами ключевых значений. – mason

ответ

2

Почему переменные названия имеют значение? Вы можете просто хранить пары в

Dictionary<string, int> 



Dictionary<string, int> values= new Dictionary<string, int>() 
{ 
    { a, 1} 
    { b, 2} 
}; 

, когда вы хотите получить

var value = values[myString].value; 
+0

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

1

Вы можете сделать это:

void Test(string myString) 
{ 
    int a, b, c, d; 
    a = b = c = d = 0; 

    var assign = new Dictionary<string, Action<int>>() 
     { 
      { "a", n => a = n }, 
      { "b", n => b = n }, 
      { "c", n => c = n }, 
      { "d", n => d = n }, 
     }; 

    string[] varNames = { "a", "b", "c", "d" }; 
    for (int i = 0; i < varNames.Length; i++) 
    { 
     if (myString.IndexOf(varNames[i]) >= 0) 
     { 
      assign[varNames[i]](3); 
     } 
    } 
} 

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