计算对象列表中空属性的百分比

时间:2018-03-28 13:37:46

标签: c# linq

我有一个像这样的对象列表:

var lstOcc = new List<Objet>();
...

public class Objet 
{
  public List<crit> lstcrit { get; set; }
}

public class crit 
{
  public string ValeurCrit { get; set; }
}

我想为每个暴击计算空暴击的百分比,并列出这些值的列表。

如果我的对象有20个暴击,我想要一个20%的列表。这行代码计算空的暴击并列出一个列表。

我知道我可以做一个foreach,但我想提高我在c#和linq中的水平。

我尝试将每个值除以暴击数量,我不知道它是否可能。

List<float> lstTemp = lstOcc.Select(occ => occ.Criteres.Select(crit => crit.ValeurCrit.Equals("")).Count() / lstOcc.Count).ToList();

ToList返回一个occ而不是暴击的列表,如果我想要一个List,它就不起作用。

感谢您的帮助。

编辑:

前:

occ1 crit[0].val = "toto" crit[1].val = ""
occ2 crit[0].val = "toto" crit[1].val = "toto"
occ3 crit[0].val = "" crit[1].val = ""

crit[0] is filled at 66 %
crit[1] is filled at 33 %

So I want a List<float> like that :
lst[0] = 66.66
lst[1] = 33.33

是否清楚?

3 个答案:

答案 0 :(得分:1)

您需要做的是在每个lstcrit中转动Objet,以便计算空元素和总元素。您可以使用Enumerable.Range

var ans = Enumerable.Range(0, lstOcc.First().lstcrit.Count)
                    .Select(n => lstOcc.Select(o => o.lstcrit[n]))
                    .Select(critseq => critseq.Count(c => !String.IsNullOrEmpty(c.val)) / (double)critseq.Count());

答案 1 :(得分:0)

我猜这就是你要找的 -

var crit1 = new crit { ValeurCrit = "string 1" };
var crit2 = new crit { ValeurCrit = "" };
var crit3 = new crit { ValeurCrit = "string 2" };
var crit4 = new crit { ValeurCrit = "" };

var crit5 = new crit { ValeurCrit = "string 3" };
var crit6 = new crit { ValeurCrit = "" };
var crit7 = new crit { ValeurCrit = "" };
var crit8 = new crit { ValeurCrit = "" };
var crit9 = new crit { ValeurCrit = "" };
var crit10 = new crit { ValeurCrit = "string 4" };

var o1 = new Objet 
{
    lstcrit = new List<crit>() {crit1, crit2, crit3, crit4}
};
var o2 = new Objet 
{
    lstcrit = new List<crit>() {crit5, crit6, crit7, crit8, crit9, crit10}
};

var lstOcc = new List<Objet>() { o1, o2 };

var result = lstOcc.Select(x => x.lstcrit.Where(y => string.IsNullOrEmpty(y.ValeurCrit)).Select(a => a).Count() * 100.00m / (decimal)x.lstcrit.Count()).ToList();

//Result
//50.00
//66.6666..

这会计算列表中空字符串的百分比。

希望这有帮助。

答案 2 :(得分:0)

编辑:@gkb首先回答了一个或多或少相似的答案。

我认为这就是你要找的东西?

using System;
using System.Linq;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var lstOcc = new List<Objet>{
            new Objet
            {
                lstcrit = new List<crit>
                {
                    new crit{ValeurCrit = "one"}, 
                    new crit{ValeurCrit = "two"}, 
                    new crit{ValeurCrit = ""}, 
                    new crit{ValeurCrit = "three"}, 
                    new crit{ValeurCrit = ""}
                }
            }, 
            new Objet{
                lstcrit = new List<crit>
                {
                    new crit{ValeurCrit = ""}, 
                        new crit{ValeurCrit = ""}, 
                        new crit{ValeurCrit = ""}, 
                        new crit{ValeurCrit = "two"}, 
                        new crit{ValeurCrit = "four"}}}};
        var res = lstOcc.Select(o => (double)o.lstcrit.Where(c => c.ValeurCrit.Equals("")).Count() / (double)o.lstcrit.Count());
        res.ToList().ForEach(r => Console.WriteLine((100*r).ToString("0.00") + "%"));       
    }
}

public class Objet
{
    public List<crit> lstcrit
    {
        get;
        set;
    }
}

public class crit
{
    public string ValeurCrit
    {
        get;
        set;
    }
}