Вопрос по c#, linq, .net – LINQ - отличается по значению?

5

Код:

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

но это отличительное предназначение для «объекта» с одинаковыми значениями. Мне нужно, в мой список,myNew за каждый месяц. (один на январь, один на февраль и т. д.). чем,news получит 12 записей.

Возможно ли что-то вродеDistinct(myNew.Month)?

ЯвляетсяNews коллекцияNew элементы? Steven
Если у вас есть несколько записей за месяц, как вы хотите решить, какую взять? Возможно, первый? Jamiec
@ Дэнни, нет перегрузки Distinct, которая принимает лямбду Rune FS
Ну, ответ на вопрос, который я добавил, дает myCustomerList.GroupBy (cust = & gt; cust.CustomerId) .Select (grp = & gt; grp.First ()); Danny Varod
@Perception: этот ответ не является дубликатом от"Distinct() with lambda?" как вы можете легко увидеть изmy answer. Rango

Ваш Ответ

5   ответов
2

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

о угодно (вы не сказали нам):

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

EditИз комментария к ответу Хабиба я вижу, что вы хотите 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...
}

EditПоскольку у вас есть проблемы с реализацией запроса в вашем коде, вам не нужно выбирать анонимный тип, который также содержит месяц. Вы также можете выбрать только саму новость:

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 когда в этом месяце нет новостей

@DannyVarod: Потому что 1. это не точный один и тот же ответ (кстати, я не видел этот ответ раньше) 2. оба вопроса могут отличаться друг от друга, если ОП уточнит его требование.
Зачем публиковать ответ после того, как он был помечен как дубликат с точно таким же ответом?
@DannyVarod: теперь лучше? ;-)
Да :-) + 8 chs
Проблема в том, что News () является списком & lt; New & gt; ... кажется, я не могу написать ваш код ... markzzz
4

Решение 1. ПолучитьMoreLinq (также доступны в виде пакета NuGet и использования

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

Решение 2. РеализацияIEqualityComparer и используйте эту перегрузку Distinct ().

5

var result  =  News()
  .GroupBy(p => p.Month)
  .Select(g => g.First())
  .ToList();
проблема заключается в следующем: если апрель не существует ни в одном новом ... как я могу вставить & quot; null & quot; вместо? markzzz
0

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

Похожие вопросы