2012-05-09 25 views
5

Duplicar posibles:
Distinct() with lambda?LINQ - ¿Distinto por valor?

Código:

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

pero esto es distinto de "objeto" con los mismos valores. Necesito, en mi lista, un myNew por cada mes. (Así que uno para enero, uno para februaru, y así sucesivamente). Than, news obtendrá 12 registros.

¿Es posible un tipo de Distinct(myNew.Month)?

+0

Si tienes múltiples registros durante un mes, ¿cómo quieres decidir cuál tomar? ¿El primero tal vez? – Jamiec

+1

¿'Noticias' es una colección de elementos' Nuevos'? – Steven

+0

@Danny no hay sobrecarga de Distinct que tome una lambda –

Respuesta

12

puede agrupar por mes y tomar la primera o la última o lo que sea (que no nos ha dicho):

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

Editar: A partir de la observación sobre la respuesta de Habib veo que desea 12 meses incluso si no hay noticias Luego hay que hacer un "LINQ de combinación externa":

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... 
} 

Editar: Puesto que usted tiene problemas para poner en práctica la consulta en su código, usted no necesitará seleccionar el tipo anónimo que contiene también el mes. También puede seleccionar sólo la noticia en 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(); 

Tenga en cuenta que ahora recibe 12 noticias, pero algunos de ellos podrían ser null cuando no hay contenido para ese mes.

+0

¿Por qué publicar la respuesta después de que se haya marcado como duplicado con la misma respuesta? –

+0

@DannyVarod: Porque 1. no es exactamente la misma respuesta (por cierto, no he visto esa respuesta antes) 2. Ambas preguntas pueden diferir entre sí si OP aclarara su requisito. –

+0

@DannyVarod: ¿Es mejor ahora? ;-) –

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

el problema es: si el abril no existe en ningún nuevo ... ¿cómo puedo insertar "nulo" en su lugar? – 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(); 
Cuestiones relacionadas