C# 如何在c语言中简化多个嵌套foreach#

C# 如何在c语言中简化多个嵌套foreach#,c#,nested-loops,C#,Nested Loops,基本上我有一个方法,它传递一个自定义对象列表。我用的是C。每一个都包含一个名称和其他自定义对象的列表,我将称这些子对象。每个都有一个名称和一个字符串列表。我需要遍历所有字符串,但为了记录错误,需要跟踪父对象和主题的名称。有没有比筑巢更干净、更好的方法 foreach (var obj in listOfObjects) { foreach (var subObj in obj.subObjects) { foreach (var aString in subOb

基本上我有一个方法,它传递一个自定义对象列表。我用的是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.
            }
        }
    }
}

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

根据您的需要。

添加到MarcinJuraszek答案,如果首选linq to objects

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

但是你发布的代码没有问题。显然,您的代码更易于快速浏览。

您希望在
if
块中使用的条件是什么?您可以使用LINQ来执行此操作,但我不确定它是否会更清晰。首先将
subobj.strings
替换为
subobj.strings)
以便它编译:我认为这种结构没有任何问题。它做它必须做的事。唯一的问题可能是,如果在该
内部,如果
您必须从外部
foreach
退出,这将需要一个标志或一个漂亮的
转到
;)@MarcinJuraszek:我该怎么做?我建议@Andrew说什么。代码是有意义的;不要过于简化。我想这正是我想要的,对我来说,它更容易阅读和处理。谢谢请注意,由于为每个元素创建新对象,此解决方案可能效率较低。除了使用不同的语法外,这是完全相同的解决方案。我的代码将被编译器转换为相同的方法调用集,但更清晰、更易于阅读。