没有ELSE的内联IF

时间:2015-07-28 14:10:09

标签: c# linq

我正在尝试根据List中的0/1模式更新string中对象的属性。

//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语句的: s.IsDeleted = s.IsDeleted - if条款感到有些遗憾。我理解内联if需要一个else - 子句,因为它需要返回一个值,但它让我想知道是否有更简洁的方法可以做到这一点。

3 个答案:

答案 0 :(得分:10)

您可以使用:

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

如果它已经true,则无论true如何,它都将保持pattern[index],否则只有pattern[index]'1'

才会变为真

答案 1 :(得分:1)

这是另一个解决方案

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

答案 2 :(得分:0)

过滤并仅在您需要的地方应用操作。你不会在这样的三元组中写出foreach等价物,所以我也不明白你为什么要在LINQ那样做。

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

请注意,Select中的变异很奇怪(由于三元变异的陌生感而复杂化);在这种情况下,您的listWithDeleted实际上会返回IEnumerable<bool>(三元的结果),这似乎很奇怪。最好使用List.ForEach或您自己的void返回IEnumerable.ForEach扩展名来使意图更清晰一些。