避免每个循环的多个嵌套

时间:2017-01-22 03:17:44

标签: c# loops foreach

我是C#的新手并且在大学学习第一门课程。我认为这是instantiation的一个问题,但这与我所追求的一致。

我想从te.ED得到不必经过多个for each循环的值,好像答案是“否”,那么就没有必要通过循环了并提取多个数据元素(未显示)。有没有办法检查 BEFORE 值是否经过所有for each循环?

代码在这里

TR reply = service.track(request);
foreach (CTD ctd in reply.CTD)
{
    foreach (TD td in ctd.TD)
    {
        if (td.Events != null)
        {
            foreach (TE te in td.Events)
            {
                if (te.TimestampSpecified)
                {
                    //This is where the field I am after exists
                    if (te.ED == "YES")
                        Console.WriteLine("The answer is yes");
                    else 
                        Console.WriteLine("The answer is no");
                }
            }
        }
    }
}

根据@Anis Programmer的评论 - 我相信您希望看到班级TD中的CTD元素。如果是这种情况 - 见下文

[System.Xml.Serialization.XmlElementAttribute("TD")]
public TD[] TD {
    get { return this.tdf; }
    set { this.tdf = value; }
}

根据@Neel的回答 - 我非常接近语法

var result = reply.CTD.SelectMany(c1 => c1.TD)
                  .SelectMany(c2 => c2.Events.Select(c3 => c3.TimestampSpecified));


foreach (var ltr in result)
    Console.WriteLine(ltr)

现在的问题是foreach循环进行了两次传递,并且从两者返回的值为True

我需要在此语法中更改哪些内容?

2 个答案:

答案 0 :(得分:0)

我从您发布的示例中假设您希望避免多个嵌套的foreach循环。

你可以使用linq来缩短它。这就是使用lamda表达式的方法。

var result = reply
    .SelectMany(c1 => c1.CTD)
    .SelectMany(c2 => c2.TD)
    .SelectMany(c3 => c3.Events.Select(c4 => c4.TimestampSpecified));

现在,您只需循环显示结果并与ED值进行比较。

答案 1 :(得分:0)

我认为您可以像foreach这样使用LinQ:

foreach (
    var te in from ctd in reply.CTD
    from td in ctd.TD
    where td.Events != null
    from te in td.Events
    where te.TimestampSpecified
    select te)
{
    Console.WriteLine(te.ED == "YES" ? "The answer is yes" : "The answer is no");
}