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

问题描述 投票:0回答:3

基本上我有一个传递自定义对象列表的方法。我正在使用 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.
            }
        }
    }
}
c# nested-loops
3个回答
3
投票

您可以编写 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();

取决于您的需求。


0
投票

添加 MarcinJuraszek 答案,如果首选对象链接...

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

但是您发布的代码没有任何问题。显然,您的快速浏览更容易理解。


0
投票

我的做法:

foreach (YourClass something in YourObject.SelectMany(x => x.Nested).SelectMany(x => x.MoreNesting)) {
    // Do Stuff Here
}

可能不是最好的方法或其他什么,这对我来说只是最清晰的方法,同时避免了我不太喜欢的三重嵌套外观。

© www.soinside.com 2019 - 2024. All rights reserved.