LINQ - 按值区分
本文关键字:值区 LINQ | 更新日期: 2023-09-27 18:33:32
Code :
news = (from New myNew in new News()
select myNew).Distinct().ToList();
但此 Distinct 用于具有相同值的"对象"。我需要在我的清单中,每个月都有一份myNew
。(所以一个代表一月,一个代表二月,依此类推)。比,news
将获得 12 条记录。
有可能是一种Distinct(myNew.Month)
吗?
您可以按月分组并采取第一个或最后一个或其他什么(您还没有告诉我们):
var news = News()
.GroupBy(n => n.Month)
.Select(grp => grp.Last());
编辑:从对哈比卜回答的评论中,我看到即使没有消息,你也需要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
。
解决方案 1。获取 MoreLinq(也可作为 NuGet 包使用)
News().DistinctBy(n => n.Property)
解决方案 2.实现一个IEqualityComparer并使用此Distinct()重载。
var result = News()
.GroupBy(p => p.Month)
.Select(g => g.First())
.ToList();
简写解决方案
var vNews = News()
.GroupBy(p => p.Month, (key, p) => p.FirstOrDefault())
.ToList();
var vNews = News()
.GroupBy(p => p.Month)
.Select(g => g.First())
.ToList();