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

时间:2011-03-02 23:19:31

标签: c# linq

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

{1,1,0,0,0}

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

5 个答案:

答案 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
                  );