C# 位的Linq平均值(真实百分比)?

C# 位的Linq平均值(真实百分比)?,c#,linq,average,C#,Linq,Average,我想从我的数据库中取一个位值的平均时间 因此,基本上是: ID 1, Value: True ID 2, Value: False ID 3, Value: True 所以我希望平均启用66%的时间 如何在linq中计算它?静态void Main(字符串[]args) static void Main(string[] args) { List<Foo> foos = new List<Foo>(); foos.Add(new Foo() { ID =

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

因此,基本上是:

ID 1, Value: True
ID 2, Value: False
ID 3, Value: True
所以我希望平均启用66%的时间

如何在linq中计算它?

静态void Main(字符串[]args)
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; }
}
{ List foos=新列表(); Add(new Foo(){ID=1,Value=true}); Add(newfoo(){ID=2,Value=false}); Add(newfoo(){ID=3,Value=true}); 双平均=(foos.Count(F=>F.Value)/Convert.ToDouble(foos.Count))*100; } 公开课Foo { 公共int ID{get;set;} 公共布尔值{get;set;} }
有很多方法,这里有一种:

var pc = values
   .Select(v => v.Value ? 1f : 0f)
   .Average();
保留百分比值,使其1==100%,以便它们能够很好地相乘,并使用
p
将其格式化以供显示:

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

或者你将永远被100乘除。

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

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

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

最短的方法可能是:

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

这假设您有一个
IEnumerable
,您正在计算以下各项的平均值:

// 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);
//只需创建一些测试数据。
IEnumerable test=Enumerable.Range(0,12)。选择(x=>x%3==0);
//计算为真的平均项目数,以%为单位。
var平均值=100*测试平均值(x=>x?1.0:0.0);

当数据源可能是数据库时,使用
Convert
之类的工具可能会很危险。它可能会工作,但实际上取决于特定LINQ提供程序支持的内容。很好,我忘记了内置选择器的重载。@MarcGravel-Thank:)因为问题是关于每美分(
66%
),可能应该是
。。。?100f:0f…
@DmitryBychenko不,我强烈建议人们将百分比保持为1=100%。它应该很容易乘法,并以字符串格式使用:
string.format(“{0:P}”,1)=“100.00%”
另一种选择是你将永远乘和除100<代码>[0..1]范围和最终格式是最好的解决方案+1.