我有一个像这样的对象列表:
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
是否清楚?
答案 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;
}
}