我应该如何使用 Linq 将布尔值转换为数字值(整数或十进制)
本文关键字:整数 十进制 数字 何使用 Linq 转换 布尔值 我应该 | 更新日期: 2023-09-27 18:36:49
I'm join against a set {uniqueidentifier ID, bool IsRead). 我想计算读者率,所以我这样做:
inbox.GroupJoin(
isRead,
p => p.ID,
r => r.ID,
(p, r) => new {ID = p.ID, ReadRate = r.Sum( x => x.IsRead ) / (decimal)r.Count() }
)
这不会编译,因为它不能对布尔值求和。 我需要将 IsRead 属性转换为 Sum 函数的小数,但我担心所使用的强制转换方法的性能。
- 我可以在 Sum 调用中使用
x => x.IsRead ? 1 : 0
,但我认为条件不合适。 - Linq2Entities 无法识别
x => Convert.ToDecimal
(据我所知,Convert.*
通常不支持)。 - 使用
(int)
直接强制转换不适用于 C# 中的布尔值。 -
r.Cast<decimal>()
不起作用,因为它没有像Sum
这样的选择器,所以我无法在没有额外工作的情况下从对象中选择IsRead
属性。 - 我可以使用
r.Select( x => x.IsRead ).Cast<decimal>().Sum()
,但我真的需要那个选择吗? - 我可以更快地将布尔值转换为整数,但我不确定如何在早期连接的赋值点执行此操作,它看起来像
(a,b) => new {ID = a.ID, IsRead = b.IsRead}
.
也许它会解决你的问题:改变
r.Sum( x => x.IsRead )
自
r.Count( x => x.IsRead )