LINQ - 价值区分?

mar*_*zzz 6 .net c# linq

代码:

news = (from New myNew in new News()
       select myNew).Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)

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

有可能是某种Distinct(myNew.Month)

Tim*_*ter 14

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

var news = News()
           .GroupBy(n => n.Month)
           .Select(grp => grp.Last());
Run Code Online (Sandbox Code Playgroud)

编辑:从对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...
}
Run Code Online (Sandbox Code Playgroud)

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

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();  
Run Code Online (Sandbox Code Playgroud)

请注意,您现在可以收到12条新闻,但有些可能是null当月没有新闻的时候.


Hab*_*bib 5

var result  =  News()
  .GroupBy(p => p.Month)
  .Select(g => g.First())
  .ToList();
Run Code Online (Sandbox Code Playgroud)


geo*_*osd 5

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

  News().DistinctBy(n => n.Property)
Run Code Online (Sandbox Code Playgroud)

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