不带ELSE的内联IF

本文关键字:IF ELSE 不带 | 更新日期: 2023-09-27 18:05:13

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

//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);

我对我的内联if -语句的else -子句: s.IsDeleted = s.IsDeleted有点难过。我理解内联if需要一个else子句,因为它需要返回一个值,但它让我想知道是否有一个更干净的方法来做到这一点。

不带ELSE的内联IF

您可以使用:

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

如果已经是true,不管pattern[index],它都将保持true,否则只有当pattern[index]'1'时它才会生效

这是另一个解决方案

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

筛选并仅在需要的地方应用操作。你不会用这样的三进制来写foreach的等价物,所以我也不明白你为什么要在LINQ中这样做。

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

请注意,在Select中发生突变是很奇怪的(在三元数中发生突变是很奇怪的);在这种情况下,你的listWithDeleted实际上返回一个IEnumerable<bool>(三进制的结果),这似乎很奇怪。最好使用List.ForEach或您自己的void返回IEnumerable.ForEach扩展,使意图更清晰。