C# — Проверка существования объекта

List .Exists(Predicate ) Метод

Определение

Определяет, содержит ли List элементы, удовлетворяющие условиям указанного предиката. Determines whether the List contains elements that match the conditions defined by the specified predicate.

Параметры

Делегат Predicate , определяющий условия поиска элементов. The Predicate delegate that defines the conditions of the elements to search for.

Возвраты

true , если List содержит один или несколько элементов, удовлетворяющих условиям указанного предиката, в противном случае — false . true if the List contains one or more elements that match the conditions defined by the specified predicate; otherwise, false .

Исключения

Свойство match имеет значение null . match is null .

Примеры

В следующем примере демонстрируются методы Contains и Exists в List , который содержит простой бизнес-объект, реализующий Equals. The following example demonstrates the Contains and Exists methods on a List that contains a simple business object that implements Equals.

В следующем примере демонстрируется метод Exists и несколько других методов, использующих универсальный делегат Predicate . The following example demonstrates the Exists method and several other methods that use the Predicate generic delegate.

Создается List строк, содержащая 8 названий динозавров, два из которых (в позициях 1 и 5) заканчиваются на «саурус». A List of strings is created, containing 8 dinosaur names, two of which (at positions 1 and 5) end with «saurus». В примере также определяется метод предиката поиска с именем EndsWithSaurus , который принимает строковый параметр и возвращает логическое значение, указывающее, заканчивается ли входная строка в «саурус». The example also defines a search predicate method named EndsWithSaurus , which accepts a string parameter and returns a Boolean value indicating whether the input string ends in «saurus».

Методы Find, FindLastи FindAll используются для поиска в списке с помощью метода предиката Search, а затем метод RemoveAll используется для удаления всех записей, оканчивающихся на «саурус». The Find, FindLast, and FindAll methods are used to search the list with the search predicate method, and then the RemoveAll method is used to remove all entries ending with «saurus».

Наконец, вызывается метод Exists. Finally, the Exists method is called. Он проходит по списку с самого начала, передавая каждый элемент в свою очередь на EndsWithSaurus метод. It traverses the list from the beginning, passing each element in turn to the EndsWithSaurus method. Поиск останавливается, а метод возвращает true , если метод EndsWithSaurus возвращает true для любого элемента. The search stops and the method returns true if the EndsWithSaurus method returns true for any element. Метод Exists возвращает false , так как все такие элементы были удалены. The Exists method returns false because all such elements have been removed.

В C# и Visual Basic нет необходимости явно создавать делегат Predicate ( Predicate(Of String) в Visual Basic). In C# and Visual Basic, it is not necessary to create the Predicate delegate ( Predicate(Of String) in Visual Basic) explicitly. Эти языки выводят правильный делегат из контекста и создают его автоматически. These languages infer the correct delegate from context and create it automatically.

Комментарии

Predicate является делегатом для метода, который возвращает true , если переданный ему объект соответствует условиям, определенным в делегате. The Predicate is a delegate to a method that returns true if the object passed to it matches the conditions defined in the delegate. Элементы текущего List по отдельности передаются делегату Predicate , а обработка останавливается при обнаружении совпадения. The elements of the current List are individually passed to the Predicate delegate, and processing is stopped when a match is found.

Цукерберг рекомендует:  Работа которая нравится - Как понять, кем я действительно хочу быть в ИТ-сфере

Этот метод выполняет линейный поиск. Таким образом, этот метод является операцией O (n), где n — Count. This method performs a linear search; therefore, this method is an O(n) operation, where n is Count.

C# dynamic obj = new ; Как проверить наличие свойства?

Как проверить наличие свойства в объекте типа dynamic?
Без try желательно.
Или как отключить ошибки во время исполнения, так что бы null присваивал?
Или другой способ?

aRpi
через reflection не?
getproperties и тд и тп
но вообще если доходит до такого я думаю что скорее всего кто то делает что то не то

а reflection это вот это?
Или по другому?

пока что вынужден так остановиться:

рефлекшен в дотнете это в общем случае получение информации о типах. т.е. например obj.GetType().GetProperty(«y») получить свойство объекта по его имени. возвращает null если такого свойства нет. т.е. так:
bool is_y = obj.GetType().GetProperty(«y») == null;
dynamic используется для позднего связывания и воопшем-то к рефлексии не относится, но через неё можно узнать есть ли у динамического объекта нужные свойства или методы.
другой вариант ловить RuntimeBinderException.

По его выводам если свойства не будет с частотой меньше чем 1/47, то эксепшены быстрее. Если чаще свойства не будет то проверка через reflection быстрее.

Как проверить, является ли объект сериализуемым в С#

Я ищу простой способ проверить, является ли объект в С# сериализуемым.

Как мы знаем, вы создаете объект сериализуемым путем реализации интерфейса ISerializable или путем размещения [Serializable] в верхней части класса.

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

Используя предложение @Flard, это код, который я придумал, крик — лучший способ.

Или даже лучше просто получить тип объекта, а затем использовать свойство IsSerializable для типа:

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

Проверка, является ли объект числом в C#

Я хотел бы проверить, является ли объект числом, так что .ToString() приведет к строке, содержащей цифры и + , — , .

это возможно с помощью простой проверки типа в .net (например: if (p is Number) )?

или я должен преобразовать в строку, а затем попытаться проанализировать на double?

обновление: для уточнения моего объекта int, uint, float, double, и так далее это не строка. Я пытаюсь сделать функцию, которая сериализует любой объект в xml вот так:

или создать исключение.

10 ответов

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

вот метод расширения, который должен выполнять эту работу:

Это должно охватывать все числовые типы.

обновление

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

конечно, это не будет обрабатывать очень большие целые числа / длинные после запятой, но если это так, вам просто нужно добавить дополнительные звонки long.TryParse / decimal.TryParse / чем-то еще.

воспользуйтесь свойством IsPrimitive, чтобы сделать удобный метод расширения:

EDIT: исправлено в соответствии с комментариями. С тех пор дженерики были удалены .Gettype () поля типы значений. Также включено исправление для значений nullable.

есть несколько отличных ответов выше. Вот решение «все-в-одном». Три перегрузки при разных обстоятельствах.

вместо того, чтобы катить свой собственный, самый надежный способ узнать, является ли встроенный тип числовым, вероятно, ссылаться Microsoft.VisualBasic и звонок Information.IsNumeric(object value) . Реализация обрабатывает ряд тонких случаев, таких как char[] и шестнадцатеричные и октавные строки.

там есть три разных понятия:

  • чтобы проверить, если это и число (т. е. (обычно в коробке) числовое значение), проверьте тип с is — например, if(obj is int)
  • чтобы проверить, может ли строка быть проанализирована как число; используйте TryParse()
  • но если объект не является числом или строкой, но вы подозреваете ToString() может дать то, что выглядит как число, то вызов ToString() и рассматривать его как строку

в первых двух случаях, вам, вероятно, придется обрабатывать отдельно каждый числовой тип вы хотите поддержать ( double / decimal / int ) — каждый из них имеет разные диапазоны и точность, например.

вы также можете посмотреть regex для быстрой грубой проверки.

Проверка на существование объекта

6 ответов

А что если обращение к форме заключить в try . и при возникновении исключения делать вывод что ее еще нет.

Или в начале указатель на форму присваивать к NULL и потом проверять перед обращением.

bool IsCreate;
HANDLE Form2IsCreate;
__fastcall TForm2::Form2(TComponent *Owner):TForm(TComponent *Owner)
<
IsCreate = false;
Form2IsCreate = CreateMutex(NULL,true,»Form2IsCreate»);

if(!Form2IsCreate) <
IsCreate = true;
//Уже есть такая форма
//Далее выполняете действия — например закрытие формы.
>
//А здесь — если форма создана в первые.
.
>
void __fastcall TForm2::FormClose(TObject *Sender,TCloseAction &Action)
<
if(!IsCreate) CloseHandle(Form2IsCreate);
Action = caFree;
>

проверить существование объекта при передаче функции по ссылке

У меня очень простая проблема, и у меня следующий код. В редких случаях мы не можем вызвать setDriver (установить объект драйвера) и вызвать функцию getDriver для вызова функции класса драйвера, что приводит к падению памяти (так как setdriver не установлен). Можно ли проверить объект getdriver. Я попытался установить NULL, но, поскольку мы возвращаем ссылку, это не подходит / неосуществимо.

После получения информации из обсуждения ниже, я изменил код следующим образом. это будет правильное решение?

Решение

Ссылки не могут указывать ни на что, поэтому я предлагаю два варианта:
а) бросить исключение — это для меня явно лучшее решение; это крайний случай и очень подходит для обработки исключений
б) Включите метод driver.isLoaded (), который может проверить вызывающий объект — в случае, если вы не можете выделить драйвер, верните драйвер заглушки, который возвращает это значение как ложное

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

Другие решения

Безопасный способ не проверять, является ли указатель нулевым, — заставить его никогда не быть:

Проверка существования объекта

Здравствуйте!
Делаю запрос по загрузке складов в другую программу по COM соединению в базе приемнике.
Подскажите, пожалуйста, условие, если такое наименование склада есть, то не создавать.

(1) переименуют склад, на покрасивей, и наплодятся новые склады, как мухоморы во время дождя.

Надо макет соответствий делать, и искать либо по коду, либо по гуиду. Чтобы хоть немного минимизировать повреждение логики пользователем. А наименование — вообще в открытом доступе.

(5) Например для этого))
А вообще нужно до конца читать справку:

Тип: СправочникСсылка. ; Неопределено.
Ссылка на найденный элемент справочника.
Если не существует ни одного элемента с требуемым наименованием, то будет возвращена пустая ссылка.
Если для справочника наименование не задано (длина = 0) и поиск выполняется по полному соответствию, то будет возвращено Неопределено .

Как проверить наличие (if…exist) или видимость элемента без вызова исключения/ошибки (Selenium WebDriver, C#)

В процессе написания автоматических тестов, с использованием Selenium WebDriver, появилась необходимость проверять наличие элемента на странице и, если элемент не существует, выполнять одни действия, если существует, то выполнять другие действия. К примеру, сейчас я работаю в сфере туристического бизнеса. При проверке функциональности сайта надо перейти в определённый тур и если есть билеты на текущее число (и кнопка «Бронировать»), то произвести заказ, если нету, то надо вернуться назад и выбрать другой тур. И так до тех пор, пока не будет найден тур, по которому можно осуществить заказ.

Если нам надо провести проверку наличия элемента на странице, то мы можем написать код:

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

Раздумывая над этим, я подумал о том, что исключения в коде мы обрабатываем с помощью «try – catch». Через определённое время было найдено решение, которое позволило проверять наличие элемента на странице и не прерывать теста, так как отсутствие элемента естественное состояние проверемой системы в определённых случаях и условиях. Если кратко, то в условии «if» мы будем проверять «true» или «false» нам возвращает функция, которая ищет элемент на странице.

Пишем метод, который обращается на странице к элементу, и которая возвращает «true» (элемент есть) или «false» (элемента нет):

Проверка наличия свойств

Часто при работе с объектом полезно проверить, что содержится в этом объекте, есть ли в нём свойство с заданным именем и ка­кое это свойство. Данную процедуру можно проделать с помощью оператора in и с помощью методов hasOwnProperty() и propertyIsEnumerable() или просто обратившись к свойству.

Оператор in

Оператор in принимает имя свойства (в виде строки) в левом операнде и объект в правом операнде. Оператор in возвращает true , если свойство содержится в указанном объекте или в его цепочке прототипов:

На заметку: Значение свойства в левом операнде оператора in заключается в двойные кавычки – то есть на самом деле указывается текстовая строка с названием свойства. Так же мы поступаем, когда к свойству объекта обращаемся с использованием квадратных скобок, то есть при использовании команды вида объект[«свойство»].

Если вы удалили свойство при помощи оператора delete, то оператор in возвратит false для этого свойства:

Если вы добавите в объект свойство со значением undefined , то для этого свойства оператор in вернет значение true :

Метод hasOwnProperty()

Метод hasOwnProperty() объекта проверяет, имеет ли объект собственное свойство с указанным именем. В отличие от оператора in, этот метод не проверяет существование свойств в цепочке прототипов объекта:

Метод propertyIsEnumerable()

Метод propertyIsEnumerable() возвращает логическое значение true , если указанное свойство является перечисляемым. Метод propertyIsEnumerable() возвращает значение false , если объект не имеет свойства с указанным именем или если указанное свойство не является перечислимым. Как правило, предопределенные свойства не являются перечислимыми, но свойства, определенные пользователем, всегда перечислимы.
Метод propertyIsEnumerable() не учитывает объекты в цепи прототипов:

Как на C# проверить наличие в списке?

squirrel

Client

Но зенка на это ругается: 10:03:16 Компиляция кода Ошибка в действии «CS1061» «»ZennoLab.InterfacesLibrary.ProjectModel.IZennoList» не содержит определение для «Find». Не удалось найти метод расширения «Find», принимающий первый аргумент типа «ZennoLab.InterfacesLibrary.ProjectModel.IZennoList» (пропущена директива using или ссылка на сборку?)».

Подскажите, что не так?

Директивы using System.Linq и using System.Collections.Generic подключены по умолчанию, а больше не знаю куда и смотреть.

Adigen

Client

Но зенка на это ругается: 10:03:16 Компиляция кода Ошибка в действии «CS1061» «»ZennoLab.InterfacesLibrary.ProjectModel.IZennoList» не содержит определение для «Find». Не удалось найти метод расширения «Find», принимающий первый аргумент типа «ZennoLab.InterfacesLibrary.ProjectModel.IZennoList» (пропущена директива using или ссылка на сборку?)».

Подскажите, что не так?

Директивы using System.Linq и using System.Collections.Generic подключены по умолчанию, а больше не знаю куда и смотреть.

Mikhail B.

Moderator

Adigen

Client

Mikhail B.

Moderator

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

Я вобще не понимаю как «Екатерина Андреева», определятся как мужской и как женский пол. У меня два списка с именами я чекаю значение в каждом из них. Может я не правильно сниппет составил?

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих