[英]Select Distinct rows when only one columns is different Linq
我有一個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.
ForEach不返回任何東西 - 它是 void 方法,因此您對x
的分配無效。 而不是這個:
var x = data.ForEach(x => x.String2= null);
你應該這樣做:
data.ForEach(x => x.String2= null);
就像 Reniuz 所說的那樣,錯誤發生是因為 forEach 沒有返回任何東西(void)。
回到您的主要問題,您提到您需要每個 Decimal 的平均值。
對於 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),然后選擇這些鍵和確定屬性(例如 Decimal1)的元素的 AVG。 如果需要,您可以添加更多 AVG 函數(avgDecimal2、avgDecimal3 等)
您想要開始使用您想要使用的值或以您想要使用它們的方式來預測您的結果。
var query = source.Select(e => new
{
e.String1,
e.Int1,
e.Int2,
e.Decimal1,
});
只需省略您不想要的屬性。
// or go straight to your average
var sum = data.GroupBy(e => new
{
e.String1,
e.Int1,
e.Int2,
e.Decimal1,
}).Average(e => e.Key.Decimal1);
我不明白你為什么想要不同的價值觀。 也許你可以提供一個例子。 一種解決方案可以是 -
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();
如果你想要不同的值,你可以在 group by 之前添加 distinct -
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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.