LINQ – 价值区分?

代码:

news = (from New myNew in new News() select myNew).Distinct().ToList(); 

但是,这个区别是具有相同值的“对象”。 在我的名单中,我每个月都需要一个myNew 。 (一个用于一月,一个用于februaru,依此类推)。 比, news将获得12记录。

有可能是一种Distinct(myNew.Month)吗?

您可以按月分组并采取第一个或最后一个或任何(您没有告诉我们):

 var news = News() .GroupBy(n => n.Month) .Select(grp => grp.Last()); 

编辑 :从对Habib答案的评论中我发现,即使没有新闻你也想要12个月。 然后你需要做一个“Linq Outer-Join”:

 var monthlyNews = from m in Enumerable.Range(1, 12) // left outer join every month join n in News() on m equals n.Month into m_n from n in m_n.DefaultIfEmpty() group n by m into MonthGroups select new { Month = MonthGroups.Key, LastNews = MonthGroups.Last() }; foreach (var m in monthlyNews) { int month = m.Month; var lastNewsInMonth = m.LastNews; if (lastNewsInMonth != null) ; // do something... } 

编辑 :由于您在代码中实现查询时遇到问题,因此您无需选择同时包含月份的匿名类型。 您也可以只选择新闻本身:

 var monthlyNews = from m in Enumerable.Range(1, 12) // every motnh join n in news on m equals n.Month into m_n from n in m_n.DefaultIfEmpty() group n by m into MonthGroups select MonthGroups.Last(); 

请注意,您现在可获得12条新闻,但当该月没有新闻时,其中一些可能为null

 var result = News() .GroupBy(p => p.Month) .Select(g => g.First()) .ToList(); 

解决方案1.获取MoreLinq (也可作为NuGet包使用

  News().DistinctBy(n => n.Property) 

解决方案2.实现IEqualityComparer并使用此Distinct()重载。

简短的解决方案

 var vNews = News() .GroupBy(p => p.Month, (key, p) => p.FirstOrDefault()) .ToList(); 
 var vNews = News() .GroupBy(p => p.Month) .Select(g => g.First()) .ToList();