Последовательность содержит более одного совпадающего элемента

6 ответов

Лучший ответ

8

Damith
13 Авг 2013 в 07:17

Что ж, это исключение говорит, что по крайней мере два элемента последовательности соответствуют вашему условию . Вызов затем вызывает исключение, потому что он утверждает, что передан только один элемент.

Чтение вашего вопроса заставляет меня думать, что вы хотите что-то сделать с каждым элементом входной последовательности, поэтому вы, вероятно, будете использовать цикл foreach:

12

Matten
13 Авг 2013 в 07:08

Смысл оператора состоит в том, чтобы утверждать, что данная последовательность имеет только один элемент. Например, при получении определенного экземпляра по первичному ключу.

Я полагаю, вы хотите изменить состояние любого , соответствующего критериям, и в этом случае у вас есть несколько вариантов, все из которых включают перечисление набора результатов и выполнение некоторого поведения.

Специально для этого не существует оператора LINQ, поскольку операторы LINQ должны быть чистыми. Чистые функции — это функции, не имеющие побочных эффектов, и это именно то, что вы пытаетесь сделать.

Однако есть метод расширения на , который позволяет это. например

Или вы можете свернуть свой собственный:

Вы можете спросить, почему ребята из Microsoft решили не добавлять это в BCL: насколько я помню, идея заключалась в том, что метод расширения по сравнению с конструкцией в любом случае не принесет больших преимуществ с точки зрения набора текста, и это не будет ‘ не помогать с точки зрения двусмысленности. Все остальные операторы не имеют побочных эффектов, и этот оператор явно предназначен для их побуждения.

2

Yannick Motton
13 Авг 2013 в 07:39

Это , брошенный методом .

Предполагается, что метод возвращает только один элемент, проверьте критерии, которые вы используете в своем запросе.

Однако также возникает исключение, когда не удается найти какой-либо элемент.

1

Rohit
13 Авг 2013 в 07:07

У вас есть более одного элемента в this.DressingItems, которые соответствуют заданным CatId и Product Id.

Если вы уверены, что должен быть один (одиночный), то вам нужно посмотреть, как загружается this.DressingItems.

Если ожидается, что их больше одного, вам нужно использовать foreach для установки значений.

1

Rex
13 Авг 2013 в 07:07

Поскольку вы ищете однострочник, вы можете создать свой собственный метод для этого.

А затем позвоните по

Таким образом, вам не нужно сначала преобразовывать результат из в .

1

Default
13 Авг 2013 в 11:58

Single

Операция Single возвращает единственный элемент последовательности или единственный элемент последовательности, соответствующий предикату — в зависимости от используемого прототипа. Эта операция имеет два прототипа, описанные ниже:

Первый прототип Single

В случае использования этого прототипа операция Single перечисляет входную последовательность по имени source и возвращает единственный ее элемент.

Второй прототип Single

Второй прототип Single принимает predicate и выглядит следующим образом:

Эта версия операции Single возвращает единственный найденный элемент, для которого predicate дает true. Если ни один из элементов не заставляет predicate вернуть true, то операция Single генерирует исключение InvalidOperationException.

Если любой из аргументов равен null, генерируется исключение ArgumentNullException.

Если последовательность source пуста, либо predicate ни разу не вернул true или нашел более одного элемента, для которых вернул true, генерируется исключение InvalidOperationException.

Ниже содержится пример применения первого прототипа Single, использующий общий класс Employee:

В данном примере вместо ожидания получения последовательности от запроса мне нужна просто ссылка на определенного сотрудника. Операция Single очень полезна в такой ситуации — до тех пор, пока вы можете гарантировать, что в переданной ему последовательности есть только один элемент. В данном случае, поскольку я вызвал операцию Where, указав уникальный ключ, я в безопасности. И вот результат:

Ниже показан пример кода, использующего второй прототип операции Single:

Данный код функционально эквивалентен предыдущему примеру. Вместо вызова операции Where для того, чтобы гарантировать наличие единственного элемента в последовательности, можно выполнить ту же операцию фильтрации последовательности в операции Single. Она должна вернуть только один элемент из входной последовательности, id которого равен 3.

Помните, если любой прототип операции Single не находит элемента для возврата, генерируется исключение InvalidOperationException. Избежать этого позволяет операция SingleOrDefault.

Метод оценки ожидаемых условий, предоставляемый классом ожидаемых условий

При автоматизации браузера часто возникают некоторые условия, реализация каждого из которых приведена ниже. Связывание Selenium Python обеспечивает определенное удобство и предоставляет множество практических методов, поэтому вам не нужно писать класс expected_condition или создавать свой собственный инструментарий для выполнения этой работы.

title_is: определяет, соответствует ли заголовок текущей страницы ожидаемому
title_contains: определяет, содержит ли заголовок текущей страницы ожидаемую строку
присутствие_of_element_located: чтобы определить, добавлен ли элемент в дерево dom, это не означает, что элемент должен быть видимым
visibility_of_element_located: определяет, является ли элемент видимым.Видимый означает, что элемент не скрыт, а ширина и высота элемента не равны 0
visibility_of: сделайте то же самое, что и вышеупомянутый метод, за исключением того, что вышеупомянутый метод должен быть передан локатору, и этот метод напрямую передает позиционированный элемент.
присутствие_of_all_elements_located: определить, существует ли хотя бы один элемент в доменном дереве. Например, если класс из n элементов на странице -‘column-md-3 ‘, то, пока существует 1 элемент, этот метод вернет True.
text_to_be_present_in_element: определяет, соответствует ли текст в элементесодержать Ожидаемая строка
text_to_be_present_in_element_value: определяет, является ли атрибут value в элементесодержатьОжидаемая строка
frame_to_be_available_and_switch_to_it: определить, можно ли переключить кадр, если возможно, вернуть True и переключиться, в противном случае вернуть False
invisibility_of_element_located: определить, не существует ли элемент в доменном дереве или он не виден
element_to_be_clickable-it is Displayed and Enabled: определяет, является ли элемент видимым и активным, в этом случае он называется интерактивным
staleness_of: подождите, пока элемент будет удален из дерева dom

Обратите внимание, что этот метод также возвращает True или False
element_to_be_selected: определяет, выбран ли элемент, обычно используется в раскрывающемся списке
element_located_to_be_selected
element_selection_state_to_be: определяет, соответствует ли выбранное состояние элемента ожиданиям.
element_located_selection_state_to_be: та же функция, что и вышеупомянутый метод, за исключением того, что вышеупомянутый метод передает обнаруженный элемент, а этот метод передает локатор
alert_is_present: определяет, есть ли на странице предупреждение

2. Неявное ожидание

Неявное ожидание — это попытка найти элемент, если он не найден сразу, он ждет фиксированный промежуток времени. Значение по умолчанию — 0 секунд. После того, как время неявного ожидания установлено, его областью действия будет весь жизненный цикл экземпляра объекта Webdriver.

Загрузка связанных данных

Существует несколько способов, которыми программное обеспечение объектно-реляционного сопоставления (ORM), такое как Entity Framework, может загружать связанные данные в свойства навигации сущности:

  • Безотложная загрузка. При чтении сущности связанные данные извлекаются вместе с ней. Обычно такая загрузка представляет собой одиночный запрос с соединением, который получает все необходимые данные. Настроить Entity Framework Core на использование безотложной загрузки можно при помощи методов и .

    Вы можете получить часть данных в отдельных запросах, и EF «исправит» свойства навигации. То есть EF автоматически добавляет раздельно извлеченные сущности к соответствующим свойствам навигации ранее извлеченных объектов. Для запроса, получающего связанные данные, можно использовать метод вместо метода, который возвращает список или объект, такого как или .

  • Явная загрузка. При первом чтении сущности связанные данные не извлекаются. Если требуется получение связанных данных, то пишется дополнительный код. Как и в случае безотложной загрузки с отдельными запросами, явная загрузка представляет собой несколько запросов к базе данных. Отличие заключается в том, что при явной загрузке в коде указывается, какие свойства навигации будут загружены. В Entity Framework Core 1.1 для выполнения явной загрузки можно использовать метод . Пример:

  • Отложенная загрузка. При первом чтении сущности связанные данные не извлекаются. Однако при первой попытке доступа к свойству навигации необходимые для этого свойства навигации данные извлекаются автоматически. Запрос к базе данных отправляется каждый раз, когда вы в первый раз пытаетесь получить данные из свойства навигации. Entity Framework Core 1.0 не поддерживает отложенную загрузку.

Особенности производительности

Если известно, что связанные данные потребуются для каждой полученной сущности, то безотложная загрузка обычно обеспечивает наилучшую производительность, поскольку одиночный запрос к базе данных обычно эффективнее нескольких отдельных запросов для каждой полученной сущности. Пусть, например, на каждом факультете есть десять связанных курсов. Безотложная загрузка всех связанных данных приведет к одиночному запросу (с соединением) и одним циклом приема-передачи данных из базы. Отдельные запросы по курсам для каждого факультета приведут к одиннадцати циклам приема-передачи данных из базы. При высокой задержке дополнительные циклы приема-передачи данных особенно сильно влияют на производительность.

С другой стороны, в некоторых случаях отдельные запросы более эффективны. Безотложная загрузка всех связанных данных в одном запросе может привести к формированию очень сложного соединения, которое SQL сервер не сможет эффективно обработать. Либо, если необходимо получить свойства навигации сущности только для подмножества обрабатываемого набора сущностей, отдельные запросы могут показать большую производительность, поскольку при безотложной загрузке всех данных будет получено больше данных, чем вам необходимо. Если важна производительность, то для выбора наилучшего решения рекомендуется протестировать производительность для обоих случаев.

9.1Подпоследовательности и предельные точки

Подпоследовательности

Пусть у нас есть последовательность {an} и возрастающая
последовательность натуральных чисел {nk}. Тогда можно рассмотреть
последовательность {bk}, опредённую таким образом: для всех
натуральных k, bk=ank. Последовательность {bk} называется
подпоследовательностью последовательности {an}.

: Выделение подпоследовательности

Пример 1. Пусть an=2n и nk=2k. Тогда bk=a2k=22k задаёт
подпоследовательность исходной последовательности, состоящей из членов с
чётными номерами.

Пример 2. Пусть an=n3, nk=k2. Тогда bk=ak2=(k2)3=k6 задаёт
подпоследовательность исходной последовательности, состоящей из членов с
номерами, являющимися полными квадратами натуральных чисел.

Замечание 1. На {nk} накладываются два условия, оба важны. Во-первых, это
последовательность, то есть в ней бесконечно много элементов (значение nk
определено для всех натуральных k). Это означает, что в
подпоследовательности есть бесконечно много элементов, взятых из исходной
последовательности. Например, нельзя образовать подпоследовательность, взяв
первые три элемента исходной последовательности. Во-вторых, {nk}
возрастает — то есть мы должны брать элементы исходной последовательности в
том же порядке, в котором они были изначально (но можем некоторые
пропускать). Нельзя взять один и тот же элемент несколько раз или «вернуться
назад». Про подпоследовательность можно думать так, что мы выбросили из
исходной последовательности какое-то количество элементов (конечное или
бесконечное), но так, чтобы осталось бесконечно много элементов.

Пусть последовательность {an} обладает каким-нибудь из следующих
свойств:

  • ограничена (сверху, снизу, просто);
  • монотонна (возрастает, убывает, невозрастает, неубывает);
  • имеет предел (конечный или бесконечный).

Тогда любая её подпоследовательность обладает тем же свойством (тоже
ограничена, тоже монотонна, тоже имеет предел, причём такой же, и т.д.)

Доказательство первых двух пунктов этого утверждения простое и я советую его
провести самостоятельно. Третий пункт вынесен в качестве задачи на семинары.
Обратное неверно: если подпоследовательность обладает каким-нибудь из этих
свойств (скажем, ограничена), это ничего не говорит про аналогичное свойство
исходной последовательности (приведите примеры).

Вопрос 1. Если последовательность неограничена, следует ли из этого, что любая её
подпоследовательность тоже неограничена?

Неверный ответ.
Попробуйте доказать :)

Верный ответ.
Действительно, можно рассмотреть неограниченную
последовательность an=((−1)n+1)n, у которой есть
тождественно нулевая подпоследовательность.

Предельные точки

an=(−1)na2k11a2k+1(−1)(−1)1(−1)предельными точками

Число A называется предельной точкой последовательности
{an} если существует такая подпоследовательность {bk},
bk=ank, что bk→A при n→∞.

Предел последовательности является её предельной точкой (можно выбрать
подпоследовательность, совпадающую с исходной последовательностью), но в отличие
от предела, предельных точек может быть несколько. Наоборот: по
, если у последовательности есть предел, то у
любой её подпоследовательности предел такой же. Значит, если предел есть, то
предельная точка единственна, и стало быть если предельных точек несколько, то
предела нет.

При решении некоторых задач удобным оказывается другое определение предельной
точки.

Число A называется предельной точкой последовательности
{an}, если для всякого ε> и всякого натурального N есть
такой номер n>N, что |an−A|<ε. Формально:
∀ε>∀N∈N∃n>N|an−A|<ε.

Сравните это определение с определением предела — в чём ключевое различие?

Упражнение 1. Докажите, что определения и
эквивалентны.

Есть ли последовательности, не имеющие предельных точек? Тут легко привести
пример — скажем, последовательность an=n обладает таким свойством: она
посещает каждое натуральное число ровно один раз, а потом уходит от него на
расстояние как минимум 1.

Заметим, что последовательсноть an=n неограничена. Бывают ли ограниченные
последовательности без предельных точек? Прежде, чем читать дальше, попробуйте
придумать такую.

4 ответа

Лучший ответ

— это скорее удобный метод получения единственного элемента запроса, чем способ ограничения количества результатов. Используя , вы, по сути, говорите: «Я знаю, что в этом запросе может быть только один элемент, поэтому просто передайте его мне», как при выполнении , когда вы знаете, что будет только один элемент. добавляет возможность возвращать вместо создания исключения при работе с последовательностями длины 0. Вы не должны использовать или с запросами, которые могут возвращать более 1 результата: будет выброшен .

Если в вашем запросе является первичным ключом таблицы или столбцом , база данных гарантирует, что результирующий набор содержит 1 строку или ни одной строки без необходимости в предложении .

Однако, если вы выбираете неуникальный / неключевой столбец и хотите получить первый результат или последний результат (обратите внимание, что они не имеют значения, если вы также не введете ), вы можете использовать или (оба имеют копии), чтобы получить желаемый SQL:

Кстати, вы можете сэкономить время на вводе текста, если действительно выполняете запрос для одного элемента:

Может стать:

3

Neil Williams
6 Май 2009 в 17:43

Аллен, является ли ID первичным ключом таблицы одиночных игр? Если это так, я не полностью понимаю вашу проблему, так как ваш второй запрос вернет одну запись или null. И SQL будет там, где ID = ### … Использование Take (2) .SingleOrDefault () противоречит цели SingleOrDefault.

Gus Cavalcanti
6 Май 2009 в 16:15

SingleOrDefault (и IEnumerable .SingleOrDefault ()) оба вызывают исключение InvalidOperationException, если последовательность содержит более одного элемента.

Ваш случай, описанный выше, никогда не может произойти — он вызовет исключение.

Редактировать:

Мое предложение здесь будет зависеть от вашего сценария использования. Если вы думаете, что будут случаи, когда вы собираетесь регулярно возвращать более нескольких строк из этого запроса, добавьте строку .Take (2). Это даст вам такое же поведение и то же исключение, но исключит возможность возврата множества записей из БД.

Однако использование SingleOrDefault () предполагает, что никогда не должно возвращаться> 1 строки. Если это действительно так, я бы не стал это делать и рассматривать это как исключение. На мой взгляд, вы снижаете удобочитаемость кода, предполагая, что при добавлении .Take (2) было бы нормально иметь> 2 записей, и в этом случае я не верю, что это правда. Я бы взял перф. хит в исключительном случае из-за простоты его снятия.

2

Reed Copsey
6 Май 2009 в 17:40

Вы уже упомянули об этом. Если вы ожидаете, что запрос будет довольно часто возвращать огромное количество строк, это может дать вам прирост производительности. Но если это исключительный случай — а ясно указывает на это — это не стоит усилий. Это просто загрязняет ваш код, и вы должны задокументировать это, если решите впустить его.

ОБНОВЛЕНИЕ

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

2

Daniel Brückner
6 Май 2009 в 16:35

7 ответов

Лучший ответ

и предназначены для выдачи, если в последовательности существует более одного совпадения. Следствием этого является то, что вся последовательность должна быть повторена до завершения. Не похоже, что это то, что вы хотите. Попробуйте вместо этого :

Это (как правило) будет работать лучше, потому что будет выполнено, как только будет найдено совпадение.

Конечно, если вы действительно хотите сохранить более одного элемента, предложение будет более подходящим:

33

spender
4 Июн 2021 в 15:08

В качестве альтернативы, если вам нужен элемент только при наличии ровно одного совпадения, и вы не хотите бросать, когда их больше одного, это можно легко сделать. Я создал для этого в своем проекте метод расширения:

27

Pieter van Ginkel
11 Май 2012 в 13:18

Если вам нужен только первый элемент, используйте вместо него .

По сути, вот варианты с точки зрения действительных результатов (т.е. куда вы не хотите бросать) и что использовать:

  • Ровно один:
  • Один или ноль:
  • Один или несколько:
  • Ноль или больше:

( и , и также доступны.)

14

Jon Skeet
6 Июл 2010 в 09:53

Я обнаружил, что мне нужно поведение возврата значения по умолчанию, если нет ровно одного элемента (т. Е. Ноль, два или более), чаще, чем мне нужно нормальное поведение , поэтому вот моя адаптированная версия Ответ Питера ван Гинкеля :

Я пропустил проверки нулевого аргумента, потому что я не против полагаться на вызовы и для выдачи исключений, когда аргументы равны нулю, но вы можете подумать иначе.

6

Community
23 Май 2017 в 12:32

предполагает, что вы ожидаете 0 или 1 результатов от вашего запроса. Если у вас их больше 1, то с вашими данными или запросом что-то не так.

Если вы ожидаете более одного результата и хотите только первый, тогда следует использовать .

4

Geoff Appleford
8 Май 2013 в 09:42

означает, что вы ожидаете быть одним элементом в последовательности. означает, что вы ожидаете, что в последовательности будет один или ноль элементов. Это следует использовать, когда вы хотите знать, что есть один (или ноль), и вы хотите, чтобы он вылетал, когда возвращалось более одного.

Если вам нужен только один, используйте (или ), как предложено выше, но убедитесь, что вы правильно упорядочили данные.

2

DaveShaw
8 Май 2013 в 10:15

Если вы используете SingleOrDefault, если условие удовлетворить больше, чем результат, это вызовет ошибку.

Вы можете добиться своего результата, используя FirstOrDefault

1

anishMarokey
6 Июл 2010 в 09:41

3 ответа

2

Лучший ответ

Может ли это решить проблему?

29 сен. 2014, в 23:05
Поделиться

1

является довольно общим. Любое из доступных свойств (или даже глубже в стеке) может вызвать это исключение. Поэтому одним из способов является использование собственного метода исключения и расширения. Например:

Это позволяет сохранить исходный код в чистоте:

Другой способ сделать это — использовать -pattern, но он не очень чистый. вернет true, даже если нет соответствующих элементов. Вы можете заменить логическое значение на enum (Valid/Invalid), но я оставлю его читателю, читается ли это или нет.

29 сен. 2014, в 23:14
Поделиться

Я рассматриваю First()/Single()/SingleOrDefault() как своего рода Assert.

то есть. Если вы их используете, вы не захотите поймать исключение. Что-то очень не так с вашими данными, и оно должно рассматриваться как критическая ошибка.

Если в вашей модели есть несколько результатов, не используйте исключения для проверки.

С этой точки зрения я не думаю, что ваша версия Take (2) менее очевидна.

30 сен. 2014, в 07:46
Поделиться

Ещё вопросы

  • 1Не могу записать данные изображения laravel 5 Intervention
  • 2Как найти все группы в ActiveDirectory, где текущий пользователь имеет доступ к WriteProperty?
  • CSS генерировать: после содержимого из текущего текущего
  • Результат запроса с несколькими OR не в порядке OR
  • 1 Загрузите файл изображения, чтобы открыть его содержимое и экспортировать как файл .jpg.
  • Как создать шаблон сообщения с полями Drap и Drop HTML 5 JQuery
  • 1импорт тензорного потока, вызывающий ошибочные вычисления
  • 2Обновление вложенных объектов в Entity Framework
  • 1Можно ли заставить websphere MQ работать по протоколу UDP?
  • 1Есть ли способ получить доступ к индексу возвращенного массива, не создавая переменную для него?
  • Как сделать условную вставку в SQL
  • Проверка формы AngularJs не работает
  • 1Тестовая сессияХранилище с Selenium Webdriver
  • Как я могу загрузить файл в код на C # через AngularJS view / controller?
  • 2Twilio StatusCallback не работает:
  • 1Python Argparse, как ссылаться на аргументы по имени
  • 1размер области рассеяния питона пропорциональная длина оси
  • 1Отражение Java не может получить доступ к динамически измененным значениям частного поля
  • 1Как обрабатывать события на несколько уровней, Java
  • 1Как изменить цвета с полигонов от руки в cornerstonejs
  • 1PHP preg_match Поиск шаблона
  • 1Содержимое JavaFX TitledPane исчезает после свертывания
  • boostrap: радио-кнопка с опцией «добавить новый» для отображения / скрытия некоторых полей
  • 2Обработка нескольких макетов и утверждений в модульных тестах
  • 2Как перехватить исходящие запросы HTTP на моем клиенте?
  • 1Найти количество слов в массиве объектов списка
  • Закройте IOS-клавиатуру в Safari с помощью Javascript / AngularJS без .blur ()
  • Как исправить это отображение CSS на iPhone Safari?
  • 1Расширяемый список в Android XML
  • 1Получить конкретный подмассив с помощью JavaScript
  • 1SQLAlchemy AttributeError: у объекта ‘module’ нет атрибута ‘PandasSQLAlchemy’
  • 1Невозможно уничтожить активность Android
  • Чем отличается системная учетная запись от учетной записи администратора при вызове функции SHGetSpecialFolderLocation ()?
  • 1почему мой `main ()` не перехватывает исключение, выданное в `timer` в тесте junit?
  • 2Связать подмножество коллекции
  • C ++ строка повторяется 8 раз за пределами цикла
  • MySQL 8.0: CTE WITH не выполняет два подпункта
  • 1Можно использовать Scapy только в интерактивном режиме?
  • 1urllib2.HTTPError Python
  • 1Проблема импорта Pylab в Python 2.6
  • 1onClickListeners с bindview и newview (лучшая практика)
  • 1Ошибка преобразования / преобразования в массив строк
  • Как мне подключиться к базе данных с помощью Dreamweaver 2019?
  • JQuery beforeSubmit не работает
  • 2Сохранение файлов на Raspberry PI с Windows IoT
  • 1Невозможно найти местоположение пользователя с помощью GPS
  • 1подписаться на downloadurl из пользовательского сервиса
  • Отключить кнопку отправки, если ввод jqBootstrapValidation недействителен (‘hasErrors’)
  • 2Новое в привязке данных WPF

Создание страницы курсов

Сущность включает свойство навигации, которое содержит сущность кафедры, к которому привязан курс. Чтобы отобразить в списке курсов название связанной кафедры, необходимо получить свойство из сущности , находящейся в свойстве навигации .

Создайте для типа сущности контроллер с именем с теми же параметрами шаблона Контроллер MVC с представлениями, использующий Entity Framework, которые мы ранее задали для контроллера , как это показано на следующем рисунке:

Откройте файл CoursesController.cs и изучите метод . В автоматически сформированном шаблоне установлена безотложная загрузка свойства навигации при помощи метода .

Замените метод следующим кодом, который использует более подходящее имя для , возвращающего сущности Course ( вместо ):

Откройте файл Views/Courses/Index.cshtml и замените код шаблона следующим кодом. Изменения выделены:

Мы внесли следующие изменения в код шаблона:

  • Изменен заголовок с Index (Индекс) на Courses (Курсы).

  • Добавлен столбец Number (Номер), отображающий значение свойства . По умолчанию в шаблоне отсутствуют первичные ключи, поскольку для конечных пользователей они не имеют смысла. Однако в нашем случае первичный ключ имеет смысл, и мы хотим его отобразить.

  • Изменен столбец Department (Кафедра) для отображения названия кафедры. Код отображает свойство сущности , которая загружена в свойство навигации :

Для просмотра списка с названиями кафедр запустите приложение и выберите вкладку Courses (Курсы).

5 ответов

Лучший ответ

— наиболее эффективный способ определить, удовлетворяет ли какой-либо элемент последовательности условию LINQ.

Дополнительное примечание: Сказанное выше верно, если вы используете Linq для объектов. Если вы используете Linq to Database, он создаст запрос и выполнит его для базы данных.

10

Farhad Jabiyev
15 Май 2015 в 13:01

Да, он останавливается, когда предикат выполняется один раз. Вот код через RedGate Reflector:

1

James Lucas
15 Май 2015 в 12:41

Никаких остановок на первом матче. Все останавливается при первом несовпадении.

Я не знаю, гарантирует ли это документация, но это поведение теперь эффективно исправлено навсегда по причинам совместимости. Это тоже имеет смысл.

1

usr
15 Май 2015 в 12:40

Он делает то, что является самым быстрым способом сделать то, что ему нужно.

При использовании на это будет примерно так:

Или для варианта, который не принимает предикат:

При запуске с базой данных это будет что-то вроде

И так далее. Как это будет выполнено, в свою очередь, будет зависеть от того, какие индексы доступны для выполнения предложения WHERE, так что это может быть быстрый поиск по индексу, полное сканирование таблицы, прерывающееся при обнаружении первого совпадения, или поиск индекса с последующим прерыванием частичного сканирования таблицы при первое совпадение найдено, в зависимости от этого.

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

В общем, вы можете рассчитывать на то, что он будет, по крайней мере, немного более эффективным, чем вызов , поскольку использует аналогичные подходы, но должен возвращать полный объект (возможно, создавая его). Точно так же имеет тенденцию в значительной степени соответствовать согласно этому ответу.

— исключение

Обновление: следующее с этого момента больше не относится к .NET Core, который изменил реализацию .

Важно отметить, что в случае с объектами linq-to перегрузки и , которые принимают предикат, не останавливаются при обнаружении сбоя. Хотя очевидный подход к будет примерно таким:. Фактическая реализация выглядит примерно так:

Фактическая реализация выглядит примерно так:

Теперь, несмотря на то, что успешный должен будет сканировать все, это может означать, что неудачный будет намного медленнее, чем нужно (и даже потенциально может вызвать недокументированную ошибку), и если причина непредвиденный дубликат — это ошибка, которая дублирует элементы в последовательности — и, следовательно, делает ее намного больше, чем она должна быть, тогда , который должен был помочь вам найти эту проблему, теперь утаскивает через это.

имеет ту же проблему.

Это применимо только к linq-to-objects, но по-прежнему безопаснее делать , чем .

2

Community
23 Май 2017 в 12:33

Вы можете проверить это сами: https://ideone.com/nIDKxr

Да :-)

Используя те же рассуждения, может продолжаться, даже если один из элементов возвращает false :-) Нет, даже запрограммирован правильно :-)

3

Community
20 Июн 2020 в 09:12

Сортировка

Для сортировки набора данных по возрастанию используется метод OrderBy:

int[] numbers = { 3, 12, 4, 10, 34, 20, 55, -66, 77, 88, 4 };
IEnumerable<int> orderedNumbers = numbers.OrderBy(i=>i);
foreach (int i in orderedNumbers)
    Console.WriteLine(i);

Метод OrderBy принимает критерий сортировки. В данном случае в качестве критерия выступает само число.

Возьмем посложнее пример. Допустим, надо отсортировать выборку сложных объектов. Тогда в качестве критерия мы можем указать свойство класса объекта:

List<User> users = new List<User>()
{
    new User { Name = "Tom", Age = 33 },
    new User { Name = "Bob", Age = 30 },
    new User { Name = "Tom", Age = 21 },
    new User { Name = "Sam", Age = 43 }
};
 
var sortedUsers = users.OrderBy(u=>u.Name);
 
foreach (User u in sortedUsers)
    Console.WriteLine(u.Name);

Метод OrderBy() сортирует по возрастанию. Для сортировки по убыванию используется метод OrderByDescending:

var sortedUsers = users.OrderByDescending(u=>u.Name);

Множественные критерии сортировки

В наборах сложных объектов иногда возникает ситуация, когда надо отсортировать не по одному, а сразу по нескольким полям. Для этого в запросе LINQ добавляются методы ThenBy (для сортировки по возрастанию) или ThenByDescending (для сортировки по убыванию):

List<User> users = new List<User>()
{
    new User { Name = "Tom", Age = 33 },
    new User { Name = "Bob", Age = 30 },
    new User { Name = "Tom", Age = 21 },
    new User { Name = "Sam", Age = 43 }
};

var result = users
    .OrderBy(u => u.Name)
    .ThenBy(u => u.Age);

foreach (User u in result)
    Console.WriteLine($"{u.Name} - {u.Age}");

Результат программы:

ООП

Шаблоны проектирования

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: