2014-11-28 2 views
0

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

foreach (var obj in listOfObjects) 
{ 
    foreach (var subObj in obj.subObjects) 
    { 
     foreach (var aString in subObj.strings) 
     { 
      if (some condition applies) 
      { 
       //log error that includes obj, subObj, and subSubObj names, and aString. 
      } 
     } 
    } 
} 
+0

Какое условие вы хотите использовать в блоке 'if'? – ekad

+1

Вы можете использовать LINQ для этого, но я не уверен, что это будет намного яснее. – MarcinJuraszek

+3

Сначала замените 'subobj.strings'' subObj.strings) ', поэтому он компилируется. :) Я не вижу никаких проблем с этой структурой. Он делает то, что должен. Единственная проблема может заключаться в том, что внутри этого 'if' вам нужно выйти из внешнего' foreach', для чего потребуется флаг или красивая 'goto'. ;) – Andrew

ответ

2

Вы можете написать запрос LINQ, чтобы получить все случаи ошибок

var errors = from obj in listOfObjects 
      from subObj in obj.subObjects 
      from aString in subObj.strings 
      where /* your condition */ 
      select new { obj, subObj, aString }; 

и чем итерацию над ними только:

foreach(var errorCase in errors) 
{ 
    // log your error 
} 

или получить первый один:

var error = errors.FirstOrDefault(); 

в зависимости от вашего урона DS.

+0

Я думаю, что это именно то, что я искал, мне гораздо легче читать и разбираться. Благодаря! – dhouse42

+0

Помните, что это решение может быть менее эффективным из-за создания нового объекта для каждого элемента. – Ripple

0

Добавление MarcinJuraszek ответа, если LINQ к объектам является предпочтительным ...

var errors = listOfObjects 
    .SelectMany(obj => obj.subObjects 
    .SelectMany(subObj => subObj.strings 
     .Where(r => /* your condition */) 
     .Select(aString => new { obj, subObj, aString }))); 

Но нет ничего плохого в коде, публикуемую. Ясно, что вам легче следовать за быстрым взглядом.

+0

Это точно такое же решение, за исключением использования другого синтаксиса. Мой код преобразуется компилятором в один и тот же набор вызовов методов, но более понятен и легко читается. – MarcinJuraszek

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