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