6

代码 :

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

但是这个 Distinct 适用于具有相同值的“对象”。我需要,在我的清单中,myNew每个月都有一个。(所以一月一个,二月一个,依此类推)。比,news将获得 12 条记录。

有可能Distinct(myNew.Month)吗?

4

5 回答 5

15

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

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当月没有新闻时。

于 2012-05-09T10:18:00.093 回答
5
var result  =  News()
  .GroupBy(p => p.Month)
  .Select(g => g.First())
  .ToList();
于 2012-05-09T10:18:37.797 回答
5

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

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

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

于 2012-05-09T15:20:35.750 回答
2

短手解决方案

var vNews  =  News()   
              .GroupBy(p => p.Month, (key, p) => p.FirstOrDefault()) 
              .ToList();
于 2014-08-20T13:10:57.247 回答
0
var vNews  =  News()   
              .GroupBy(p => p.Month)   
              .Select(g => g.First())   
              .ToList();
于 2012-05-09T10:29:00.663 回答