我有一个1和0的列表,我现在必须计算百分比含义,如果1他实现了它,否则他没有。例如 -
{1,1,0,0,0}
因此,例如,如果List有5个项目,他有2个,那么他的百分比是40%。在LINQ中是否有功能或方法我可以轻松地在一行中完成它?我确信LINQ专家有一种温文尔雅的方式吗?
答案 0 :(得分:8)
怎么样?
var list = new List<int>{1,1,0,0,0};
var percentage = ((double)list.Sum())/list.Count*100;
或者如果您想获得特定元素的百分比
var percentage = ((double)list.Count(i=>i==1))/list.Count*100;
修改强>
注意BrokenGlass的解决方案,并对第一种情况使用Average
扩展方法,如
var percentage = list.Average() * 100;
答案 1 :(得分:5)
如果您正在使用任何ICollection<T>
(例如List<T>
),则Count
属性可能为O(1);但是在任何序列的更一般情况下,Count()
扩展方法将是O(N),使其不理想。因此,对于最一般的情况,您可能会考虑这样的事情,它会计算一次匹配指定谓词和所有元素的元素:
public static double Percent<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
int total = 0;
int count = 0;
foreach (T item in source)
{
++count;
if (predicate(item))
{
total += 1;
}
}
return (100.0 * total) / count;
}
然后你就做了:
var list = new List<int> { 1, 1, 0, 0, 0 };
double percent = list.Percent(i => i == 1);
输出:
40
答案 2 :(得分:5)
在这种特殊情况下,您还可以使用Average()
:
var list = new List<int> {1,1,0,0,0};
double percent = list.Average() * 100;
答案 3 :(得分:1)
最佳方法:
var percentage = ((double)list.Count(i=>i==1))/list.Count*100;
或
var percentage = ((double)list.Count(i=>i <= yourValueHere))/list.Count*100;
答案 4 :(得分:0)
如果您
list.Sum()
,因为您的列表数据不是1和0 你可以这样做:
percentAchieved = (int)
((double)(from MyClass myClass
in myList
where MyClass.SomeProperty == "SomeValue"
select myClass).ToList().Count /
(double)myList.Count *
100.0
);