我是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
我需要在此语法中更改哪些内容?
答案 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");
}