让 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 等效项