Получение foreach работать однажды

Таким образом, вопрос - это, я имею для каждого цикла, который я в настоящее время использую для получения данных из запроса XML-файла, который затем помещается в строку; как так:

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

Я знаю для факта (На основе пути значения хранилищ XML-файла и используемый запрос), что только будет одно значение в dateQuery.

Таким образом я хотел бы знать (в целях сделать мою программу более эффективной и изучить, как кодировать лучше), существует ли лучший способ сделать, это или действительно ли foreach's - единственный путь?

9
задан Immanu'el Smith 29 June 2010 в 13:07
поделиться

11 ответов

Вы можете использовать:

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

Это не сработает, если в запросе есть несколько элементов. Если вы хотите, чтобы при наличии нескольких элементов он не работал, используйте Single

.
18
ответ дан 4 December 2019 в 05:57
поделиться

Если вы используете .NET 3.5 или новее, вы можете использовать метод расширения Enumerable.Single :

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

Тогда, если ваше предположение 'будет только одно значение в dateQuery 'неверно, это вызовет исключение.

7
ответ дан 4 December 2019 в 05:57
поделиться
date = dateQuery.Single().Element("HistoryCreation").Value;
8
ответ дан 4 December 2019 в 05:57
поделиться

Эммануал, если вы знаете, что вам нужно сделать что-то только один раз, вам не следует использовать цикл.

5
ответ дан 4 December 2019 в 05:57
поделиться

Попробуйте Enumerable.Single или Enumerable.SingleOrDefault :

 date = dateQuery.Single().Element("HistoryCreation").Value;
2
ответ дан 4 December 2019 в 05:57
поделиться
dateQuery.First().Element("HistoryCreation").Value

, если вы можете использовать LINQ

2
ответ дан 4 December 2019 в 05:57
поделиться

Разве вы не можете просто получить доступ к первому индексу dateQuery?

date = dateQuery[0].Element("HistoryCreation").Value;
2
ответ дан 4 December 2019 в 05:57
поделиться

, который должен помочь:

using System.Linq;

dateQuery.Single();
1
ответ дан 4 December 2019 в 05:57
поделиться

Ответ Марка, безусловно, лучший, но я поставил свой для иллюстрации цикла foreach.

foreach (var value in dateQuery) {
    date = value.Element("HistoryCreation").Value;
    break;  // break current loop
}
5
ответ дан 4 December 2019 в 05:57
поделиться

Подведение итогов:

  • используйте First (), если вы хотите получить первый элемент и знаете, что в последовательности есть хотя бы один (или несколько) элементов.
  • используйте FirstOrDefault (), если последовательность может иметь любое количество элементов
  • используйте Single (), если последовательность может иметь ровно один элемент
  • используйте SingleOrDefault (), если последовательность всегда имеет либо ноль, либо один элемент

Обратите внимание, что существуют также их версии, которые принимают предикаты, поэтому вы можете сократить

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

до

var result = sequence.First(predicate);
4
ответ дан 4 December 2019 в 05:57
поделиться

Вы можете попробовать

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 ничего нет, будет сгенерировано исключение.

2
ответ дан 4 December 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: