如何在c#中简化多个嵌套的foreach

时间:2014-11-28 18:09:34

标签: c# nested-loops

基本上我有一个传递自定义对象列表的方法。我正在使用C#。其中每个都包含一个名称和另一个自定义对象列表,我将其称为这些子对象。每个都有一个名称和一个字符串列表。我需要循环遍历所有字符串,但要跟踪父对象和主题的名称以进行错误记录。除了嵌套foreach之外,还有更清洁,更好的方法吗?

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.
            }
        }
    }
}

2 个答案:

答案 0 :(得分: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();

取决于您的需求。

答案 1 :(得分:0)

添加到MarcinJuraszek的答案,如果linq对象是首选......

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

但是你发布的代码没有错。很明显,你很快就会更容易理解。