2009-07-18 3 views
0

Есть быстрый способ сказатьЕсть быстрый способ сказать Если notempty х = у еще х = по умолчанию в Linq где запроса

Where (data.x == (If notempty x = y else x = default)) 

Предполагая, что данные сравниваемых это обе строки

Compare listitem.string with passed.string - if passed.string isnotempty, else passed.string equals default value. 

в запросе Linq 'where`.

Извините, что вопрос был действительно плохо написан.

... По комментариям обновленных ...

+1

Вы должны быть немного более выразительными относительно того, что представляют собой «x» и «y», и каков их фактический тип. –

+0

У вас есть назначение и равенство в выражении? –

+0

Не могли бы вы прояснить, что означает «непустой»? – Noldorin

ответ

3

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

Попробуйте следующее предложение (где data.x - это ваш текущий элемент и y в переданном аргументе).

where y == (string.IsNullOrEmpty(y) ? "default" : data.x) 

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


Если что-то пустое? Я предполагаю, что вы имеете в виду y.

Для общего типа T, вы можете использовать следующий пункт:

where data.x == (y ?? DefaultValue<T>()) 

где DefaultValue является общей функцией, которая возвращает T так называемое значение «по умолчанию».

+0

'(y ?? default (T))' is '(y! = Default (T)? Y: default (T))', который является просто 'y' –

+0

Хорошая точка. Он должен быть просто произвольной функцией, а не ключевым словом 'default'. – Noldorin

+0

А, кажется, я правильно интерпретировал это на этот раз. :) – Noldorin

3

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

Where (data.x == (!string.IsNullOrEmpty(y) ? y : "default")) 

Это называется conditional operator.

+1

Это, вероятно, близко к тому, что хочет OP. Обратите внимание, однако, что оценка '! Foo' в условном ('! String.IsNullOrEmpty (y) 'здесь) считается плохой практикой. Намного проще просто переключить порядок значений true/false return. :) – Noldorin

+0

@Noldorin: Я знаю, просто не хотел менять вещи вокруг по сравнению с фрагментом в вопросе; Хороший момент для повышения, спасибо за это. –

+0

Да, справедливо. Для согласованности, вероятно, имеет смысл оставить это таким образом. (Это также больше соответствует нулевому коалесцирующему оператору.) – Noldorin

3

Ваш оригинальный пост может быть интерпретированы следующим образом:

where (data.x ?? y) == y 

Edit: Я теперь уверен, что это то, что вы пытаетесь. :)

Редактировать 2: Это null-coalescing operator.

Редактировать 3: Кто бы ни проголосовал за меня, должен опубликовать причину. Я интерпретировал первый пост как: «Если x не пуст, он должен равняться y, но это нормально, чтобы использовать значение по умолчанию (typeof y)». Для ссылочных типов или типов с нулевым значением, мое сообщение верное.

Редактировать 4: Шахта все еще может быть самым чистым ответом на его обновленное сообщение. Я продолжаю читать, и это все еще странно сформулировано. Еще одна возможность - сообщение (string.IsNullOrEmpty(y)).

+0

По общему признанию, вопрос не очень ясен, но я очень сомневаюсь, что это то, чего хочет OP. У вас есть x и y неправильный путь для начала. – Noldorin

+0

Проверьте мои изменения. Эта формулировка имеет смысл в оригинальной записи, и вот как она может быть использована. «Если пользователь ввел опцию * y *, сделайте что-то. Кроме того, * y * является значением по умолчанию, поэтому, если они ничего не ввели, все в порядке». Это всего лишь один пример. –

+0

Нет никаких указаний на то, что это значение по умолчанию - 'y'. На самом деле, совсем наоборот - я не понимаю, как это могло бы быть. – Noldorin

Смежные вопросы