Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算对象列表中空属性的百分比_C#_Linq - Fatal编程技术网

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

C# 计算对象列表中空属性的百分比,c#,linq,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%的列表。这行代码计算空c

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

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

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

public class crit 
{
  public string ValeurCrit { get; set; }
}
我想计算每个暴击的空暴击百分比,并列出这些值

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

我知道我可以取得成功,但我想提高我的c和linq水平

我试着用暴击数除以每个值,我不知道这是否可行

List<float> lstTemp = lstOcc.Select(occ => occ.Criteres.Select(crit => crit.ValeurCrit.Equals("")).Count() / lstOcc.Count).ToList();
ToList返回occ列表,而不是crit列表,如果我想要一个列表,它将不起作用

谢谢你的帮助

编辑:

例:


清楚吗?

我想这就是你要找的-

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..
这将计算列表中空字符串的百分比


希望这能有所帮助。

编辑:@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;
    }
}

您需要做的是在每个对象中旋转lstcrit,以便计算空元素和总元素。您可以为此使用可枚举的范围:

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());

我不明白你想达到什么目的。请重新表述:我想计算每个暴击的空暴击百分比,并列出这些值。所以我可以帮你。是的,这有点难以解释。你的例子毫无意义,而且使用的名称不匹配。既然你说你知道如何在一个循环中完成它,那么请发布一个可以编译的小例子;从那里,你应该更容易看到你想要什么,并帮助你把它转换成LINQ。刚刚注意到你打败了美赞克,几乎是。。。我想要一份crit清单,而不是occ清单。如果我的对象有10个暴击,我想要一个有10个值的列表。事实上,我将使用此列表根据您的问题制作一张图表,您似乎对OCC中带有空ValeurCrits的暴击感兴趣。c.val应替换为c.ValeurCrit…否则,答案很好..但是,结果应包含第二个lstOcc的计数,如下所示well@gkb我使用了所提供示例中的.val,因为它较短。
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());