2015-07-28 2 views
0

Я пытаюсь обновить свойство объектов в List на основе шаблона 0/1 в string.Inline IF без ELSE

//list.length is always == pattern.length 
string pattern = Convert.ToString(8, 2); 
var listWithDeleted = list.Select((s, index) => pattern[index] == '1' ? s.IsDeleted == true : s.IsDeleted = s.IsDeleted); 

Я немного грустно об else -clause : s.IsDeleted = s.IsDeleted моего встраиваемыми if -statement. Я понимаю, что inlined if нуждается в else -clause, поскольку он должен вернуть значение, но это заставило меня задуматься, может ли быть более чистый способ сделать это.

+0

Не будет 'pattern [0]' всегда равным true, а все остальное всегда равно false? Не могли бы вы заменить 'pattern [index] == '1'' на' index == 0'? –

+0

Я думаю, что есть проблема с исходным кодом. Если я попытаюсь скомпилировать оператор присваивания в третьем выражении тернарного оператора, я получу эту ошибку: «Дерево выражений может не содержать оператор присваивания». Вы имеете в виду, 'list.Select ((s, index) => pattern [index] == '1'? S.IsDeleted == true: s.IsDeleted == s.IsDeleted);'? –

+1

@WyattEarp Оригинальные компиляции отлично подходят для меня, хотя и с предупреждением о присвоении той же переменной. –

ответ

10

Вы можете использовать:

s.IsDeleted = pattern[index] == '1' || s.IsDeleted 

Если это уже true, он будет оставаться true независимо от pattern[index], в противном случае она будет только стать истинным, если pattern[index] является '1'

+1

Мне интересно, действительно ли это правильно сейчас, я более внимательно посмотрел на код OP. На самом деле это не изменяет значение 's.IsDeleted' в любой момент, тогда как мой. @Iggy - можете ли вы подтвердить, что это то, что вам нужно? Если нет, я удалю ... –

1

Вот еще одно решение

s.IsDeleted = pattern[index] == '1' ? true : s.IsDeleted 
0

Фильтр и примените только операцию, в которой вы нужно. Вы бы не написали эквивалент foreach в тройной форме, поэтому я не понимаю, зачем вам это делать и в LINQ.

list.Where((s, index) => pattern[index] == '1').Select(s => s.IsDeleted = true); 

Обратите внимание, что это странно мутировать в Select (усугубляются странности мутирует в троичной); в этом случае ваш listWithDeleted фактически возвращает IEnumerable<bool> (результат тройной), который кажется странным. Было бы лучше использовать List.ForEach или ваш собственный void, возвращающий IEnumerable.ForEach расширение, чтобы сделать намерение немного яснее.

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