2013-06-03 3 views
0

Мои две петли ForEach позволяют получить доступ к errorOrders (имя пользователя и их количество ошибок) и totalOrders (имя пользователя и их количество общих заказов).Foreach выполняет повторную логику

Мой код постоянно проходит через эти два ForEaches. «Счет» для обоих errorOrders и totalOrders составляет 38, и программа проходит через все 38 пользователей. Но затем он продолжает повторять их снова и снова, повторно выполняя процесс, который он только что закончил.

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

foreach (KeyValuePair<string, int> error in errorOrders) 
{ 
    foreach (KeyValuePair<string, int> total in totalOrders) 
    { 

     errPercentage = ((double)error.Value/(double)total.Value);       
     Console.WriteLine("Percentage of errors for " + total.Key + ": " + Math.Round(errPercentage, 2) * 100 + "%"); 
     ordersPerHour = OrdersPerHour(total.Key); 
     RandomOrders = RandomSelect(errPercentage, total.Key); 

     Console.WriteLine("Number of orders pulled : " + RandomOrders.Rows.Count); 
     //Print out orders randomly collected 
     for (int i = 0; i < RandomOrders.Rows.Count; i++) 
     { 
      Console.WriteLine(RandomOrders.Rows[i]["ControlNumber"]); 
     } 

     Console.WriteLine("\r\n"); 
     //NumOrdersToPull = FindNumOrdersToPull(Math.Round(errPercentage,2), ordersPerHour); 
    } 

} 
+0

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

+0

Почему вы используете вложенные циклы? Я бы предположил, что errorOrders будет меньше, чем totalOrders, и вы не захотите перебирать totalOrders в каждом сообщении об ошибке. –

+0

Вы говорите, что это петли над пользователями ... где? Я ничего не вижу о пользователях в этом коде. Кроме того, что такое RandomSelect и RandomOrders? – Hogan

ответ

6

Отделите петли вместо гнездования их. Помещение одного внутри другого делает целым дочерним циклом цикла для каждого экземпляра родительской петли. (Отсюда и название.)

// (shared variables here) 

foreach (KeyValuePair<string, int> total in totalOrders) 
{ 
    // Code relevant to all orders here 
} 

foreach (KeyValuePair<string, int> error in errorOrders) 
{ 
    // Code relevant to erroneous orders only here 
} 

Если петли должны совместно использовать переменные, объявите их перед первым циклом. Переменные, созданные внутри цикла, будут локальными и перестанут существовать, когда их цикл закончен.

+1

+1 Я собирался предложить отделить петли. –

+0

Он использует оба метода totalOrders и errorOrders в цикле здесь: errPercentage = ((double) error.Value/(double) total.Value); – Tejo

+0

@Tejo, это правда, OP, возможно, потребуется поменять порядок циклов. Если totalOrders и errorOrders имеют значение, они должны быть объявлены за пределами циклов, чтобы они не были уничтожены, когда один foreach закончен. – 4444

1

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

foreach(total in total orders) 
{ 

} 
foreach(error in errororders) 
{ 

} 

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

0

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

foreach (KeyValuePair<string, int> total in totalOrders) 
{ 
    // do work for each order 
    object whatever; 
    if (errorOrders.TryGetValue(total.Key, out whatever)) 
    { 
     // do extra work because this order has an error 
    } 
} 
1

Попробуйте это:

foreach (KeyValuePair<string, int> error in errorOrders) 
{ 
    if (totalOrder.HasKey(error.Key) { 
     var total = totalOrders[error.Key]; 

     errPercentage = ((double)error.Value/(double)total);       
     Console.WriteLine("Percentage of errors for " + error.Key + ": " + Math.Round(errPercentage, 2) * 100 + "%"); 
     ordersPerHour = OrdersPerHour(error.Key); 
     RandomOrders = RandomSelect(errPercentage, error.Key); 


     Console.WriteLine("Number of orders pulled : " + RandomOrders.Rows.Count); 
     //Print out orders randomly collected 
     for (int i = 0; i < RandomOrders.Rows.Count; i++) 
     { 
      Console.WriteLine(RandomOrders.Rows[i]["ControlNumber"]); 
     } 

     Console.WriteLine("\r\n"); 
     //NumOrdersToPull = FindNumOrdersToPull(Math.Round(errPercentage,2), ordersPerHour); 
    } 
} 
0

Другие ответы помогли мне прийти к такому выводу:

foreach (KeyValuePair<string, int> e in errorOrders) 
{ 
    errPercentage = GetErrPercentage(e.Key); 
    Console.WriteLine("Percentage of errors for " + e.Key + ": " + Math.Round(errPercentage, 2) * 100 + "%"); 
    ordersPerHour = OrdersPerHour(e.Key); 
    RandomOrders = RandomSelect(errPercentage, e.Key); 
} 

Console.WriteLine("Number of orders pulled : " + RandomOrders.Rows.Count); 
//Print out orders randomly collected 
for (int i = 0; i < RandomOrders.Rows.Count; i++) 
{ 
    Console.WriteLine(RandomOrders.Rows[i]["ControlNumber"]); 
} 
Console.WriteLine("\r\n"); 

static double GetErrPercentage(string user) 
{ 
    double errPercentage = 0; 
    errPercentage = (double)errorOrders[user]/ (double)totalOrders[user];   
    return errPercentage; 
} 
Смежные вопросы