让 foreach 运行一次

Posted

技术标签:

【中文标题】让 foreach 运行一次【英文标题】:Getting a foreach to run once 【发布时间】:2011-03-09 15:01:36 【问题描述】:

所以问题是这样的,我有一个 for each 循环,我目前使用它从 XML 文件的查询中检索数据,然后将其放入字符串中;像这样:

foreach (var value in dateQuery)
                date = value.Element("HistoryCreation").Value;

我知道一个事实(基于 xml 文件存储值的方式和正在使用的查询)dateQuery 中只有一个值。

因此,我想知道(为了使我的程序更高效并学习如何更好地编码),是否有更好的方法来做到这一点,或者是 foreach 是唯一的方法吗?

【问题讨论】:

我不敢相信回答这个问题花了这么长时间(3 分钟)。 有时需要一分钟才能显示问题。尤其是在首页(不是当你点击“问题”时) 【参考方案1】:

你可以使用:

dateQuery.First().Element("HistoryCreation").Value

如果查询中有多个项目,这不会失败。如果你想让它在有多个项目时失败,那么使用 Single

【讨论】:

【参考方案2】:
date = dateQuery.Single().Element("HistoryCreation").Value;

【讨论】:

【参考方案3】:

如果您使用的是 .NET 3.5 或更新版本,您可以使用扩展方法 Enumerable.Single:

var value = dateQuery.Single();
date = value.Element("HistoryCreation").Value;

如果你的假设“dateQuery 中只有一个值”是错误的,它会抛出异常。

【讨论】:

tster:我删除了它 - 很明显他使用的是 var 的 3.5。【参考方案4】:

Mark 的答案是迄今为止最好的,但我将我的答案用于说明 foreach 循环。

foreach (var value in dateQuery) 
    date = value.Element("HistoryCreation").Value;
    break;  // break current loop

【讨论】:

【参考方案5】:

Emmanual,如果你知道你只需要做一次,你不应该使用循环。

【讨论】:

【参考方案6】:

总结:

如果您想要第一个项目并且知道序列中至少有一个(或多个)项目,请使用 First()。 如果序列可以包含任意数量的项目,则使用 FirstOrDefault() 如果序列只能包含一项,则使用 Single() 如果序列总是包含零项或一项,则使用 SingleOrDefault()

请注意,这些版本也有带有谓词的版本,以便您可以缩写

var result = sequence.Where(predicate).First();

var result = sequence.First(predicate);

【讨论】:

【参考方案7】:

你不能简单地访问dateQuery的第一个索引吗?

date = dateQuery[0].Element("HistoryCreation").Value;

【讨论】:

@tster - 同意,但问题中并未暗示这一点。 你需要检查 dateQuery 是否至少有一个元素,否则你会得到一个索引超出范围的异常。【参考方案8】:

试试Enumerable.Single或Enumerable.SingleOrDefault:

 date = dateQuery.Single().Element("HistoryCreation").Value;

【讨论】:

【参考方案9】:
dateQuery.First().Element("HistoryCreation").Value

如果你能够使用 LINQ

【讨论】:

该死的,你真的需要快速抽签! 我同意,这些答案都是正确的;他们来得太快了。 ://【参考方案10】:

你可以试试

var theValue = dateQuery.FirstOrDefault();
if (theValue != null)

   data = theValue.Element("HistoryCreation").Value;

else

       //Deal with the fact that there is no data

您可以使用 .First() 或 .Single(),但如果 dataQuery 中没有任何内容,则会引发异常。

【讨论】:

【参考方案11】:

这应该可以解决问题:

using System.Linq;

dateQuery.Single();

【讨论】:

以上是关于让 foreach 运行一次的主要内容,如果未能解决你的问题,请参考以下文章

无法让 ForEach 循环在 SwiftUI 中使用嵌套的 JSON 数据运行 [关闭]

Python 中的 C# Parallel.Foreach 等效项

使用foreach一次性添加多个单选按钮

Qt foreach() 仅迭代一次,忽略其余项目

如何让 Picker 使用 ForEach 循环返回 VideoFormat var?

在 ForEach 循环中运行程序