【发布时间】:2016-07-04 09:57:41
【问题描述】:
我想从我的数据库中平均一个位值的时间。
所以基本上是这样的:
ID 1, Value: True
ID 2, Value: False
ID 3, Value: True
所以我想要平均 66% 的启用时间...
如何在 linq 中计算?
【问题讨论】:
我想从我的数据库中平均一个位值的时间。
所以基本上是这样的:
ID 1, Value: True
ID 2, Value: False
ID 3, Value: True
所以我想要平均 66% 的启用时间...
如何在 linq 中计算?
【问题讨论】:
可能最短的方法是:
double average = collection.Average(item => item.Value ? 1.0 : 0.0);
【讨论】:
有很多方法,这里有一个:
var pc = values
.Select(v => v.Value ? 1f : 0f)
.Average();
保持您的百分比值,使 1 == 100%,以便它们很好地相乘,并使用 P 格式化它们以供显示:
var pc = 2f/3f;
string.Format("{0:P0}", pc); // 67%
否则你将永远乘以除以 100。
【讨论】:
66%),大概应该是...? 100f : 0f...
string.Format("{0:P}", 1) = "100.00%" 另一种方法是您将永远乘以和除以 100。
[0..1] range 和 final formatting 是,恕我直言,最好的解决方案; +1
在 LINQ 中?未经测试,但可能类似于:
var percent = source.Select(row => row.Value ? 1.0 : 0.0).Average();
您也可以使用Count() 和Count(x => x.Value),但这可能是两次访问数据库。
【讨论】:
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 提供程序支持的内容。
这假设您有一个 IEnumerable<bool> 来计算平均值:
// 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);
【讨论】: