コード :
news = (from New myNew in new News()
select myNew).Distinct().ToList();
しかし、この Distinct は同じ値を持つ「オブジェクト」用です。私のリストにはmyNew
、各月が必要です。(つまり、1 月に 1 つ、2 月に 1 つなど)。より、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
。
解決策 1. MoreLinqを取得します(NuGet パッケージとしても利用可能で、使用します
News().DistinctBy(n => n.Property)
var result = News()
.GroupBy(p => p.Month)
.Select(g => g.First())
.ToList();
var vNews = News()
.GroupBy(p => p.Month)
.Select(g => g.First())
.ToList();