我应该如何使用 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}.

我应该如何使用 Linq 将布尔值转换为数字值(整数或十进制)

也许它会解决你的问题:改变

r.Sum( x => x.IsRead )

r.Count( x => x.IsRead )