Получение foreach для запуска один раз - PullRequest
9 голосов
/ 29 июня 2010

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

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

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

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

Ответы [ 11 ]

18 голосов
/ 29 июня 2010

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

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

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

8 голосов
/ 29 июня 2010
date = dateQuery.Single().Element("HistoryCreation").Value;
7 голосов
/ 29 июня 2010

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

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

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

5 голосов
/ 29 июня 2010

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

foreach (var value in dateQuery) {
    date = value.Element("HistoryCreation").Value;
    break;  // break current loop
}
4 голосов
/ 29 июня 2010

Подводя итог:

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

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

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

до

var result = sequence.First(predicate);
4 голосов
/ 29 июня 2010

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

2 голосов
/ 29 июня 2010

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

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 голосов
/ 29 июня 2010
dateQuery.First().Element("HistoryCreation").Value

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

2 голосов
/ 29 июня 2010

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

 date = dateQuery.Single().Element("HistoryCreation").Value;
2 голосов
/ 29 июня 2010

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

date = dateQuery[0].Element("HistoryCreation").Value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...