как я могу проверить, действительно ли объект, возвращенный функцией linq FirstorDefault, по умолчанию?
существует ли альтернативный способ проверки того, является ли контакт выше значением по умолчанию, а не используется:
Вам не нужно будет выполнять проверку равенства, потому что ваш запрос возвращает объекты, в которых имя contantName Stackoverflow . Когда вы используете FirstOrDefault , он возвращает null , если объекты не найдены, поэтому вы можете сделать
Вы знаете, что это ссылочный тип, если Contact является классом, поэтому значение по умолчанию будет равно null. Однако вы можете проверить тип по умолчанию любого объекта (ссылку или значение) с помощью default .
Как уже упоминалось в комментариях, вы можете сделать свой код более эффективным, используя перегрузку FirstOrDefault , которая берет предикат.
Вы также можете изменить значение по умолчанию, возвращаемое, если ваша программа должна работать с чем-то другим, кроме null или 0 . Например
Вышеуказанный объект возвращает объект defaultContact , если другой объект не найден (вместо того, чтобы возвращать null). Если вы это сделаете, вам не нужно проверять наличие null или default(T) , поскольку вы знаете, что у вас есть объект Contact .
Как я понимаю, в Linq метод FirstOrDefault() может возвращать значение Default чего-то другого, кроме null. То, что я не разработал, — это то, что этот метод (и аналогичный) может быть возвращен другим, кроме null, когда в результате запроса нет элементов. Есть ли какой-либо особый способ, которым это можно настроить так, чтобы, если для конкретного запроса нет значения, в качестве значения по умолчанию возвращается значение определенного значения?
Общий случай, а не только для типов значений:
Опять же, это не может действительно сказать, было ли что-то в вашей последовательности, или если первое значение было по умолчанию.
Если вам это интересно, вы можете сделать что-то вроде
и использовать как
хотя, как указывает г-н Стейк, это можно сделать также с помощью .DefaultIfEmpty(. ).First() .
Как я понимаю, в Linq метод FirstOrDefault() может возвращать значение по умолчанию, отличное от нуля.
Нет. Вернее, он всегда возвращает значение по умолчанию для типа элемента. которое является либо нулевой ссылкой, либо нулевым значением типа значения NULL, либо натуральным значением «все нули» для типа значения, не имеющего значения NULL.
Есть ли какой-либо конкретный способ, которым это можно настроить, чтобы, если для конкретного запроса нет значения, в качестве значения по умолчанию возвращается значение определенного значения?
Для ссылочных типов вы можете просто использовать:
Конечно, это также даст вам «другое значение по умолчанию», если первое значение присутствует, но является нулевой ссылкой.
0 Simon [2016-09-28 15:05:00]
У меня есть массив объектов, и я хотел бы найти индекс какого-либо определенного объекта внутри этого массива:
Элемент с не существует, но результат ix равен 1. Итак, я полагаю, что значение по умолчанию для int равно 1. Как я могу узнать, принадлежит ли 1 к первому элементу или значению по умолчанию? Было бы неплохо, если бы я мог установить значение по умолчанию на -1.
В конце я сделал это с помощью метода findIndex, но хотел бы знать, как это сделать с помощью метода indexOf.
4 ответа
4 Решение CodeCaster [2016-09-28 15:09:00]
Таким образом, у вас есть две части одной проблемы. Во-первых, вы хотите найти продукт:
И когда этот продукт будет найден, вы хотите найти его индекс в коллекции products :
Вы на полпути, используя FirstOrDefault() . Если продукт с идентификатором «xxx» не существует, product будет равен null . Поэтому вы можете проверить это и пропустить IndexOf() для null :
Тот факт, что ваш текущий код возвращает 1, означает, что products[1] null .
Первый или по умолчанию возвращает первый элемент (в этом случае первый элемент, найденный в условиях where) ИЛИ, значение по умолчанию.
Это вернет OBJECT, если будут выполнены условия (первый объект, который устанавливает условие).
Однако, если условия не выполняются, он возвращает null (значение по умолчанию OBJECT), поэтому ваш код будет пытаться найти indexOf (продукты, null).. это будет исключение NullReferenceException.
FirstOrDefault выполняет свою работу под типом OBJECT, находящимся внутри массива.
После этого результат передается как параметр в методе indexOf.
«indexOf» вернет индекс первого объекта в условие «where».
Если не найден, indexOf вернет -1.
Кстати, у вас нет круглых скобок.
1 Gavin [2016-09-28 15:25:00]
Иногда значение default (TSource) не является значением по умолчанию, которое вы хотите использовать, если коллекция не содержит элементов. Вместо того, чтобы проверять результат на нежелательное значение по умолчанию, а затем, при необходимости, изменять его, вы можете использовать метод DefaultIfEmpty (IEnumerable, TSource) для указания значения по умолчанию, которое вы хотите использовать, если коллекция пуста. Затем вызовите First (IEnumerable), чтобы получить первый элемент.
Однако я не уверен в вашей проблеме. Ваш код не является синтаксически правильным (вы где-то не хватает), но, похоже, вы вызываете FirstOrDefault() после своего Where(). Это либо вернет элемент, либо null. Поскольку вы сказали, что элемент с идентификатором «xxx» не существует, он будет проверять индекс null в вашем массиве. Значение по умолчанию для indexOf (опять же, для Microsoft) «нижняя граница массива минус 1.» Это должно вернуть -1 (я надеюсь) вместо 1.
Вывод: лучше взгляните на свой код и посмотрите, что происходит на самом деле. Разбейте эту инструкцию linq на две разные части.
Затем выполните свой код, чтобы проверить значения всего. Я уверен, что вы найдете свою проблему, и это будет не так, как вы ожидали.
0 krimog [2016-09-28 15:29:00]
Если вы хотите вызвать FirstOrDefault для структуры, но значение по умолчанию такое же, как и действительное, выполните одно из следующих действий:
(Я не буду использовать ваш код, так как отсутствующая скобка не позволяет узнать, какова ваша цель)
Таким образом, 0 будет первым правильным значением, а null будет означать, что правильных значений нет.
Источник: