【问题标题】:Linq Average of bit (true percentage)?Linq 位平均值(真实百分比)?
【发布时间】:2016-07-04 09:57:41
【问题描述】:

我想从我的数据库中平均一个位值的时间。

所以基本上是这样的:

ID 1, Value: True
ID 2, Value: False
ID 3, Value: True

所以我想要平均 66% 的启用时间...

如何在 linq 中计算?

【问题讨论】:

    标签: c# linq average


    【解决方案1】:

    可能最短的方法是:

    double average = collection.Average(item => item.Value ? 1.0 : 0.0);
    

    【讨论】:

    • 很好,我忘记了内置选择器的重载。
    • @MarcGravell - 谢谢 :)
    【解决方案2】:

    有很多方法,这里有一个:

    var pc = values
       .Select(v => v.Value ? 1f : 0f)
       .Average();
    

    保持您的百分比值,使 1 == 100%,以便它们很好地相乘,并使用 P 格式化它们以供显示:

    var pc = 2f/3f;
    string.Format("{0:P0}", pc); // 67%
    

    否则你将永远乘以除以 100。

    【讨论】:

    • 既然问题是关于 per cents (66%),大概应该是...? 100f : 0f...
    • @DmitryBychenko 不,我强烈建议人们将百分比保持为 1 = 100%。它应该很容易以字符串格式进行乘法和使用:string.Format("{0:P}", 1) = "100.00%" 另一种方法是您将永远乘以和除以 100。
    • 我明白了; [0..1] range 和 final formatting 是,恕我直言,最好的解决方案; +1
    【解决方案3】:

    在 LINQ 中?未经测试,但可能类似于:

    var percent = source.Select(row => row.Value ? 1.0 : 0.0).Average();
    

    您也可以使用Count()Count(x => x.Value),但这可能是两次访问数据库。

    【讨论】:

      【解决方案4】:
      static void Main(string[] args)
      {
          List<Foo> foos = new List<Foo>();
          foos.Add(new Foo() { ID = 1, Value = true });
          foos.Add(new Foo() { ID = 2, Value = false });
          foos.Add(new Foo() { ID = 3, Value = true });
      
          double Average = (foos.Count(F => F.Value) / Convert.ToDouble(foos.Count)) * 100;
      }
      
      
      public class Foo
      {
          public int ID { get; set; }
          public bool Value { get; set; }
      }
      

      【讨论】:

      • 当数据源可能是数据库时,使用Convert之类的东西可能很危险。它可能有效,但实际上取决于特定的 LINQ 提供程序支持的内容。
      【解决方案5】:

      这假设您有一个 IEnumerable&lt;bool&gt; 来计算平均值:

      // Just create some test data.
      IEnumerable<bool> test = Enumerable.Range(0, 12).Select(x => x%3 == 0);
      
      // Compute the average number of items that are true, as a %.
      var average = 100 * test.Average(x => x ? 1.0 : 0.0);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-07
        • 2021-03-03
        相关资源
        最近更新 更多