Таким образом, вопрос - это, я имею для каждого цикла, который я в настоящее время использую для получения данных из запроса XML-файла, который затем помещается в строку; как так:
foreach (var value in dateQuery)
date = value.Element("HistoryCreation").Value;
Я знаю для факта (На основе пути значения хранилищ XML-файла и используемый запрос), что только будет одно значение в dateQuery.
Таким образом я хотел бы знать (в целях сделать мою программу более эффективной и изучить, как кодировать лучше), существует ли лучший способ сделать, это или действительно ли foreach's - единственный путь?
Вы можете использовать:
dateQuery.First().Element("HistoryCreation").Value
Это не сработает, если в запросе есть несколько элементов. Если вы хотите, чтобы при наличии нескольких элементов он не работал, используйте Single
. Если вы используете .NET 3.5 или новее, вы можете использовать метод расширения Enumerable.Single
:
var value = dateQuery.Single();
date = value.Element("HistoryCreation").Value;
Тогда, если ваше предположение 'будет только одно значение в dateQuery 'неверно, это вызовет исключение.
date = dateQuery.Single().Element("HistoryCreation").Value;
Эммануал, если вы знаете, что вам нужно сделать что-то только один раз, вам не следует использовать цикл.
Попробуйте Enumerable.Single или Enumerable.SingleOrDefault :
date = dateQuery.Single().Element("HistoryCreation").Value;
dateQuery.First().Element("HistoryCreation").Value
, если вы можете использовать LINQ
Разве вы не можете просто получить доступ к первому индексу dateQuery
?
date = dateQuery[0].Element("HistoryCreation").Value;
, который должен помочь:
using System.Linq;
dateQuery.Single();
Ответ Марка, безусловно, лучший, но я поставил свой для иллюстрации цикла foreach.
foreach (var value in dateQuery) {
date = value.Element("HistoryCreation").Value;
break; // break current loop
}
Подведение итогов:
Обратите внимание, что существуют также их версии, которые принимают предикаты, поэтому вы можете сократить
var result = sequence.Where(predicate).First();
до
var result = sequence.First(predicate);
Вы можете попробовать
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 ничего нет, будет сгенерировано исключение.