我有一个data = List<Model>
,其中Model
看起来像这样
public class Model{
public string String1 { get; set; }
public int Int1{ get; set; }
public int Int2{ get; set; }
public string String2 { get; set; }
public decimal Decimal1{ get; set; }
...
public decimal DecimalN{ get; set; }
}
我希望每个DecimalX
值组的平均值分别为String1
,Int1
,Int2
,但是我的问题是有时我有两个或更多相同的行并且只有String2
是不同的,所以我想做Distinct
,但是由于这个String2
属性而无法使用。我试图将String2
的所有值更改为null
或empty
字符串
var x = data.ForEach(x => x.String2= null);
但我收到错误Cannot asign void to implicitly- typed variable.
答案 0 :(得分:1)
就像Reniuz所说的那样,发生错误是因为forEach不返回任何内容(无效)。
回到主要问题,您想到需要每个小数的平均值。
对于Decimal1,您可以执行以下操作:
var b = list.GroupBy(g => new { g.String1, g.Int1, g.Int2 }).Select(r=> new {r.Key.String1, r.Key.Int1, r.Key.Int2, avgDecimal1 = r.Select(g=>g.Decimal1).Average()}).ToList();
首先,您需要对将成为键的元素进行分组(没有像您所说的String2),然后,选择那些键和已确定属性的元素的AVG(例如Decimal1)。您可以根据需要添加更多AVG函数(avgDecimal2,avgDecimal3等)
答案 1 :(得分:0)
ForEach不返回任何内容-这是空方法,因此您对x
的分配无效。
代替这个:
var x = data.ForEach(x => x.String2= null);
您应该这样做:
data.ForEach(x => x.String2= null);
答案 2 :(得分:0)
您首先要使用要使用的值或要使用它们的方式来投影结果。
if (s.charAt(i) == t.charAt(i) && s.length() >= 0 && s.length() < t.length())
只需省略不需要的属性。
var query = source.Select(e => new
{
e.String1,
e.Int1,
e.Int2,
e.Decimal1,
});
答案 3 :(得分:0)
我不明白您为什么想要独特的价值观。也许您可以提供一个例子。 一种解决方案可以是-
var result = data.GroupBy(x => new { x.String1, x.Int1, x.Int2 })
.Select(g => new
{
String1 = g.Key.String1,
Int1 = g.Key.Int1,
Int2 = g.Key.Int2,
AvgDecimal1 = g.Select(x => x.Decimal1).Average(),
AvgDecimal2 = g.Select(x => x.Decimal1).Average(),
AvgDecimalN = g.Select(x => x.Decimal1).Average()
}).ToList();
如果要使用不同的值,可以在分组依据之前添加不同的-
data.Select(d => new Model { String1 = d.String1, Int1 = d.Int1, Int2 = d.Int2, Decimal1 = d.Decimal1, Decimal2 = d.Decimal2, DecimalN = d.DecimalN }) //returning new collection with String2 as null
.Distinct()