LINQ groupby搜索包含

时间:2018-10-10 18:56:09

标签: c# linq

我得到以下结果:

var result = (from p1 in db.Table
              select new ReportInform 
              {
                  DataValue =  p1.DataValue, 
                  SampleDate = p1.SampleDate 
              })
              .Distinct()
              .ToList();

// Next getting list of duplicate SampleDates
var duplicates = result.GroupBy(x => x.SampleDate)
                       .Where(g => g.Count() > 1)
                       .Select (x => x)
                       .ToList();


foreach (var r in result)
{
    if (duplicates.Contains(r.SampleDate)) // get error here on incompatbility 
    {
        r.SampleDate = r.SampleDate.Value.AddMilliseconds(index++);
    }
}

enter image description here

2 个答案:

答案 0 :(得分:1)

  

无法从“ System.DateTime?”转换吗?到“ System.Linq.IGrouping

该错误非常明显,但乍一看可能并非如此。作为程序员,您需要学习如何阅读,理解和理解编译器或运行时错误。

无论如何,它抱怨无法将DateTime?转换为System.Linq.IGrouping<System.DateTime, ReportInForm>。为什么?因为此查询返回一个System.Linq.IGrouping<System.DateTime, ReportInForm>

var duplicates = result.GroupBy(x => x.SampleDate)
                   .Where(g => g.Count() > 1)
                   .Select (x => x)
                   .ToList();

GroupBy方法返回具有IGrouping<System.DateTime, ReportInForm>的{​​{1}},而Key是您分组的对象以及该组中的项目列表。您正在按Key进行分组,并检查该组中是否有多个项目,然后选择该组。因此SampleDate有一个dulplicates的列表,您要让运行时检查它是否包含IGrouping<System.DateTime, ReportInForm>并在此行爆炸:

DateTime?

解决此问题的一种方法是:您要做的是选择该组的密钥。因此,这样做:

duplicates.Contains(r.SampleDate)

答案 1 :(得分:0)

如果您期望duplicates的类型为List<DateTime?>,那么您打算写这个

.Select(x => x.Key)

代替

.Select(x => x)