2015-08-01 5 views
-5

У меня есть foreach петли, и я пытаюсь суммировать все значения, полученныхКак суммировать значения в цикле Еогеаспа

foreach (var v in medals) 
{ 
    v2 = Regex.Replace(v.value.Trim('"').ToLower(), "Gold", "100") 
     .Replace("Silver", "75") 
     .Replace("Bronze", "50"); 
} 

Я пытаюсь добавить до 100,75 и 50 таким образом общее показано было быть 225.

+0

Что такое 'v2'? Чего вы хотите достичь с выходом? Зачем использовать регулярное выражение для первой замены, а не для последующих замещений? –

+1

_ToLower() _, но затем вы сравниваете его с _Gold_ – Steve

+2

Как говорит @PatrickHofman, но вам действительно нужно Regex здесь? Каковы первоначальные значения _medals_? Если это всего лишь одно слово (золото, серебро или бронза), то регулярное выражение совершенно не нужно. – Steve

ответ

1

Попробуйте

int total = 0; 
foreach (var v in medals) 
      { 
       v2 = Regex.Replace(v.value.Trim('"').ToLower(), "Gold", "100") 
        .Replace("Silver", "75") 
        .Replace("Bronze", "50"); 
       total += int.Parse(v2); 
      }​ 
+1

Этот код никогда не заменит ничего ... –

0

Вам нужно просто добавить текущее значение v в отдельной переменной, объявленной вне цикла foreach, поэтому у ou сохранить сумму всех входящих значений v в переменную вне области цикла, как показано в другом ответе.

4

Если элементы медали простые строки с только слова «золото, серебро и бронза», то нет никакой необходимости использовать Regex и простой, если может быть более простым в коде и понять

int v2 = 0; 
foreach (var v in medals) 
{ 
    string temp = v.ToLower(); 
    if(temp == "gold") 
     v2 += 100; 
    else if(temp == "silver") 
     v2 += 75; 
    else if(temp == "bronze") 
     v2 += 50; 
} 
Console.WriteLine("Total is:" + v2.ToString()); 

И если вы хотите попробовать одну строку в LINQ

var total = medals.Sum(x => x.ToLower() == "gold" ? 100 : x.ToLower() == "silver" ? 75 : 50); 

(не очень эффективным, хотя, лучше обычный цикл Еогеасп с TOLOWER называется только один раз)

+0

Словарь с нечувствительным к регистру сравнением сделает версию LINQ более компактной. –

0

Ваша коллекция медалей - это, вероятно, словарь (в коде, который вы используете внутри цикла v.Value), поэтому, если v.Value является строкой, вы можете создать словарь для сопоставлений с помощью stringComparer, а затем использовать его внутри Sum ():

Dictionary<string,int> values = new Dictionary<string,int> 
       (StringComparer.CurrentCultureIgnoreCase) 
{ 
    {"gold",100}, 
    {"silver",75}, 
    {"bronze",50} 
}; 

int result = medals.Sum(v => values.ContainsKey(v.Value) ? values[v.Value] : 0); 

Этот код предполагает, что коллекция медалей - это словарь.

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