6

コード :

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

しかし、この Distinct は同じ値を持つ「オブジェクト」用です。私のリストにはmyNew、各月が必要です。(つまり、1 月に 1 つ、2 月に 1 つなど)。より、news12レコードを取得します。

一種の可能性はあり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

解決策 1. MoreLinqを取得します(NuGet パッケージとしても利用可能で、使用します

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

解決策 2. IEqualityComparer を実装し、この Distinct() オーバーロードを使用します。

于 2012-05-09T15:20:35.750 に答える
5
var result  =  News()
  .GroupBy(p => p.Month)
  .Select(g => g.First())
  .ToList();
于 2012-05-09T10:18:37.797 に答える
0
var vNews  =  News()   
              .GroupBy(p => p.Month)   
              .Select(g => g.First())   
              .ToList();
于 2012-05-09T10:29:00.663 に答える