当只有一列不同的Linq时选择Distinct行

时间:2018-12-20 15:30:39

标签: c# 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值组的平均值分别为String1Int1Int2,但是我的问题是有时我有两个或更多相同的行并且只有String2是不同的,所以我想做Distinct,但是由于这个String2属性而无法使用。我试图将String2的所有值更改为nullempty字符串

var x = data.ForEach(x => x.String2= null);

但我收到错误Cannot asign void to implicitly- typed variable.

4 个答案:

答案 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()

第一个解决方案产生以下结果- enter image description here