2012-05-09 13 views
5

Eventuali duplicati:
Distinct() with lambda?LINQ - Distinti per valore?

Codice:

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

ma questo distinto è per "oggetto" con gli stessi valori. Ho bisogno, nella mia lista, di un myNew per ogni mese. (così uno per gennaio, uno per februaru, e così via). Quindi, news otterrà 12 record.

È possibile una sorta di Distinct(myNew.Month)?

+0

Se hai più record per un mese, come vuoi decidere quale prendere? Il primo forse? – Jamiec

+1

'News' è una raccolta di elementi' New'? – Steven

+0

@Danny non c'è sovraccarico di Distinct che prende una lambda –

risposta

12

Si potrebbe gruppo per mese e prendere la prima o l'ultima o qualsiasi altra cosa (che non ci avete detto):

var news = News() 
      .GroupBy(n => n.Month) 
      .Select(grp => grp.Last()); 

Edit: Dal commento sulla risposta di Habib vedo che si desidera 12 mesi anche se non ci sono novità. Allora avete bisogno di fare un "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... 
} 

Edit: Dal momento che hai problemi per implementare la query nel codice, non è necessario selezionare il tipo anonimo che contiene anche il mese. È anche possibile selezionare solo la notizia in sé:

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(); 

Si noti che è ora ottenere 12 notizia, ma alcuni di loro potrebbero essere null quando non ci sono notizie in quel mese.

+0

Perché postare la risposta dopo che questa è stata contrassegnata come duplicata con la stessa risposta esatta? –

+0

@DannyVarod: Perché 1. non è esatta la stessa risposta (btw, non ho visto prima questa risposta) 2. entrambe le domande potrebbero differire più l'una dall'altra se OP chiarirebbe il suo requisito. –

+0

@DannyVarod: è meglio ora? ;-) –

5
var result = News() 
    .GroupBy(p => p.Month) 
    .Select(g => g.First()) 
    .ToList(); 
+0

il problema è: se l'aprile non esiste in nessun nuovo ... come posso inserire "null", invece? – markzzz

0
var vNews = News() 
       .GroupBy(p => p.Month) 
       .Select(g => g.First()) 
       .ToList(); 
2

var vNews = News() 
       .GroupBy(p => p.Month, (key, p) => p.FirstOrDefault()) 
       .ToList(); 
Problemi correlati