отличные от одного столбца и max от другого столбца linq

Мне нужно выбрать различное поле Name и max из поля datetime DataCop, этот код не работает, спасибо

List l = new List();
l.Add(new Data { Id = 0, Name = "A", DataCop = new DateTime(2012, 1, 4) });
l.Add(new Data { Id = 1, Name = "A", DataCop = new DateTime(2012, 1, 5) });
l.Add(new Data { Id = 2, Name = "A", DataCop = new DateTime(2012, 5, 4) });
l.Add(new Data { Id = 3, Name = "B", DataCop = new DateTime(2012, 3, 1) });
l.Add(new Data { Id = 4, Name = "B", DataCop = new DateTime(2012, 3, 5) });
l.Add(new Data { Id = 5, Name = "C", DataCop = new DateTime(2012, 2, 1) });
l.Add(new Data { Id = 6, Name = "D", DataCop = new DateTime(2012, 2, 1) });

DateTime start = new DateTime(2012,1,2);
DateTime end = new DateTime(2012,4,1);


var res = (from Data d in l
           let max = l.Where(x => x.Id == d.Id).Max(x => x.DataCop)
           let maxId = l.Where(x => x.Id == d.Id && x.DataCop == max)
                        .Select(x => x.Id).FirstOrDefault()
           where d.DataCop >= start && d.DataCop <= end &&
               d.Id == maxId && d.DataCop == max
           select d).ToList();


foreach (var item in res)
{
    Console.WriteLine(item.Id.ToString() + "\t" + item.Name + "\t" + item.DataCop.ToShortDateString());
}
Console.ReadLine();
2

2 ответы

с синтаксисом метода linq

Группируйте по имени и выберите первый элемент (экземпляр данных) каждой группы, упорядоченной по методу DataCop (это сначала укажет максимальную дату)

var res = l.GroupBy(m => m.Name)
            .Select(g => g.OrderByDescending(x => x.DataCop)
                        .First())
            .ToList();

с синтаксисом запроса (смешанным)

var result = (from r in l
              group r by r.Name into g
              select g.OrderByDescending(x => x.DataCop)
                      .First())
             .ToList();
2
добавлено
Наиболее простым способом было бы задать новый вопрос (этот как базовый) с вашими новыми потребностями (и код, ваш образец был бы идеальным в этом случае). Или обновить свой вопрос.
добавлено автор Raphaël Althaus, источник
Большое спасибо
добавлено автор andyww, источник
как объединить это с соединением с другим объектом, а затем выбрать новые свойства из обоих?
добавлено автор andyww, источник

Группируйте данные по имени, затем выберите последние данные из каждой группы:

 var res = from d in l
           group d by d.Name into g
           let lastData = g.OrderByDescending(x => x.DataCop).First()
           select new Data()
           {
               Name = g.Key,
               Id = lastData.Id,
               DataCop = lastData.DataCop
           };
0
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot