Нужно отфильтровать данные на 2 столбца, который создает уникальную комбинацию? - PullRequest
1 голос
/ 28 июня 2019

У меня есть таблица данных с 5 столбцами, мне нужно найти максимальную дату для уникальной комбинации из 2 столбцов.

Ищете руководство, о том, как добиться, поэтому еще ничего не пробовали. Буду ли я объединять значения в 2 столбца и использовать это как свое уникальное значение для получения максимальных записей? Здесь я заблудился о том, как лучше всего выполнить эту задачу

Вот простая таблица данных с соответствующими столбцами

Column 1 Column 2 Column 3 Column 4 Column 5
     2   4/25/2019      25          
     2   3/25/2019      26          
     2   2/15/2019      25

Column 1 Column 2 Column 3 Column 4 Column 5
     2   4/25/2019       25         
     2   3/25/2019       26         

Если бы я запустил свой фильтр для этих 3 записей, я бы ожидал получить обратно 2 записи, как указано выше. Причина в том, что мне нужно, чтобы Column 1 и Column 3 были уникальными, а затем мне нужен только тот, с максимальной датой.

Ответы [ 3 ]

1 голос
/ 28 июня 2019

Полагаю, вы ищете это:

    DataTable dt = new DataTable();
    dt.Columns.Add("Col1", typeof(int));
    dt.Columns.Add("Col2", typeof(DateTime));
    dt.Columns.Add("Col3", typeof(int));

    dt.Rows.Add(2, DateTime.Parse("2/15/2019"), 25);
    dt.Rows.Add(2, DateTime.Parse("5/25/2019"), 25);
    dt.Rows.Add(2, DateTime.Parse("3/25/2019"), 26);

    dt.AsEnumerable()
    .GroupBy(r => new {col1 = r.Field<int>("Col1"), col2 = r.Field<int>("Col3")} )
    .Select(g =>
        g.Select(s=> s).OrderByDescending(o=>o.Field<DateTime>("Col2")).FirstOrDefault()
    );
0 голосов
/ 28 июня 2019

Как @mariocatch сказал, что вы можете использовать группирование по - вы можете создать уникальный ключ несколько столбцов, используя эту технику:

group x by new { x.Column1, x.Column3 }

или

GroupBy(x => new { x.Column1, x.Column3 })

Ваш результат будет выглядеть как-токак это:

foos.GroupBy(x => new { x.Column1, x.Column3 })
   .Select(x => x.OrderByDescending(y => y.Date).First()
0 голосов
/ 28 июня 2019

Вы можете использовать LINQ для достижения того, что вам нужно:

// foos.GroupBy(c => c.Number)
    .Select(c => c.OrderByDescending(b => b.Date).Take(1))
    .SelectMany(c => c).ToList();

// as pointed out by @Flater, using `Take(1)` will return an `IEnumerable<T>`
//  which requires unnecessary flattening through `SelectMany()`.
// instead, use .First() to take off the top of the ordered collection
foos.GroupBy(c => c.Number)
    .Select(c => c.OrderByDescending(b => b.Date).First());

Это сгруппирует каждый элемент по свойству Number, которое является вашим Column3.Затем он возьмет элемент с наивысшей датой из каждой группы, а затем сведет его обратно к списку типов вашей сущности.

...