linq从列表中计算百分比的最佳方法是什么?

Vis*_*hal 1 c# linq

我有一个1和0的列表,我现在必须计算百分比含义,如果1他实现了它,否则他没有.例如 -

{1,1,0,0,0}
Run Code Online (Sandbox Code Playgroud)

所以对于例如如果List有5个项目他有2个,那么他的百分比是40%.在LINQ中是否有功能或方法我可以轻松地在一行中完成它?我确信LINQ专家有一种温文尔雅的方式吗?

Mar*_*ner 8

关于什么

var list = new List<int>{1,1,0,0,0};
var percentage = ((double)list.Sum())/list.Count*100;
Run Code Online (Sandbox Code Playgroud)

或者如果你想获得特定元素的百分比

var percentage = ((double)list.Count(i=>i==1))/list.Count*100;
Run Code Online (Sandbox Code Playgroud)

编辑

注意BrokenGlass的解决方案并使用第Average一种情况的扩展方法,如

var percentage = list.Average() * 100;
Run Code Online (Sandbox Code Playgroud)


Dan*_*Tao 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;
}
Run Code Online (Sandbox Code Playgroud)

那你就做了:

var list = new List<int> { 1, 1, 0, 0, 0 };
double percent = list.Percent(i => i == 1);
Run Code Online (Sandbox Code Playgroud)

输出:

40


Bro*_*ass 5

在这种特殊情况下,您还可以使用Average():

var list = new List<int> {1,1,0,0,0};
double percent = list.Average() * 100;
Run Code Online (Sandbox Code Playgroud)