Что-то, что я делаю все больше и больше, проверяет строку на пустое (как в ""
или ноль) и условный оператор.
Текущий пример:
s.SiteNumber.IsNullOrEmpty() ? "No Number" : s.SiteNumber;
Это просто метод расширения, он эквивалентен:
string.IsNullOrEmpty(s.SiteNumber) ? "No Number" : s.SiteNumber;
Так как он пустой и не нулевой, ??
не сработает. string.IsNullOrEmpty()
Версия ??
будет идеальным решением. Я думаю, что должен быть более чистый способ сделать это (я надеюсь!), Но я не мог найти его.
Кто-нибудь знает лучший способ сделать это, даже если это только в .Net 4.0?
c#
string
coalesce
null-coalescing-operator
Ник Крейвер
источник
источник
let (|?) x y = if String.IsNullOrEmpty(x) then y else x
и пользуйся какs.SiteNumber |? "No Number"
.Ответы:
Нет встроенного способа сделать это. Однако вы можете заставить свой метод расширения возвращать строку или ноль, что позволит оператору объединения работать. Это было бы странно, однако, и я лично предпочитаю ваш нынешний подход.
Поскольку вы уже используете метод расширения, почему бы просто не создать метод, который возвращает значение или значение по умолчанию:
источник
???
оператора в C # 5, хотя, кто знает.item ?? x=> x.ToString() : null;
C # уже позволяет нам подставлять значения
null
с помощью??
. Итак, все, что нам нужно, это расширение, в которое преобразуется пустая строкаnull
, а затем мы используем его следующим образом:Класс расширения:
источник
Я знаю, что это старый вопрос, но я искал ответ, и ничего из вышеперечисленного не соответствовало моим потребностям, а также тому, что я в итоге использовал:
Использование:
РЕДАКТИРОВАТЬ: еще более компактный способ написания этой функции будет:
источник
using System.Linq
У меня есть пара служебных расширений, которые я люблю использовать:
Изменить: Вдохновленный ответом sfsr, теперь я буду добавлять этот вариант в свою панель инструментов:
источник
@
префикс@default
параметра? Я никогда не видел этого раньше.default
в качестве имени переменной, даже если это зарезервированное ключевое слово в C #.Возможно, немного более быстрый метод расширения, чем предложенный ранее:
источник
code
открытая статическая строка Coalesce (эта строка @this, строка @default = "") {return (@this == null || String.IsNullOrWhiteSpace (@this))? @default: @this; }Одним из преимуществ нуль-коалесцирующего оператора является его короткое замыкание. Когда первая часть не равна нулю, вторая часть не оценивается. Это может быть полезно, когда запасной вариант требует дорогостоящей операции.
Я закончил с:
Использование:
источник
Я просто использую метод расширения NullIfEmpty, который всегда будет возвращать ноль, если строка пуста, что позволяет ?? (Нулевой оператор объединения), который будет использоваться как обычно.
Это тогда позволяет ?? используется как обычно и делает цепочку легко читаемой.
источник
как насчет метода расширения строки ValueOrDefault ()
или вернуть ноль, если строка пуста:
Не пробовал эти решения, хотя.
источник
...OrDefault()
может привести к путанице, если он не будет вести себя как остальные...OrDefault()
методы фреймворка . Нравится вам это или нет, но MS придал конкретное значение тому, что присвоение имен и отклонение от этого поведения в пользовательских методах излишне сбивают с толку пользователей вашего API.Я использую собственный метод расширения Coalesce. Поскольку те, кто здесь используют LINQ, и абсолютно бесполезно тратят ресурсы на операции, требующие много времени (я использую их в тесных циклах), я поделюсь своими:
Я думаю, что это довольно просто, и вам даже не нужно беспокоиться о нулевых строковых значениях. Используйте это так:
Я использую это много. Одна из тех «утилитарных» функций, без которых вы не можете жить после первого использования :-)
источник
s2.Coalesce(s3)
запускаются, даже если они не нужны. Лучше использоватьNullIfEmpty()
расширение и??
.Мне нравится краткость следующего метода расширения
QQQ
для этого, хотя, конечно, оператор, как? было бы лучше. Но мы можем сделать это 1, позволяя сравнивать не только два, а три значения строковых опций, которые сталкиваются с необходимостью обрабатывать время от времени (см. Вторую функцию ниже).источник
Or
, и я бы использовалparams
ключевое слово, как и другие ответы, что позволяет избежать дублирования определений для нескольких параметров.params
этом случае было бы лучше не делать этого для сценария по умолчанию или двух, поскольку этоparams
приводит к ненужному выделению массива, когда у вас есть только один или два входа по умолчанию. После этого имеет смысл.