извлекает наиболее распространенный элемент на основе значения столбца с помощью C # generics

#c# #linq #generics #lambda #expression

#c# #linq #generics #лямбда #выражение

Вопрос:

У меня есть приведенный ниже код, который извлекает наиболее распространенную зрелость из PetsAgeDataTable. У меня этот код работает, но мне нужно будет проделать тот же трюк с другим столбцом. Поэтому мне нужно сделать его универсальным и передать лямбда-выражение, чтобы его можно было использовать повторно. Я просто трачу слишком много времени, пытаясь разобраться в этом, спрашивая, не будет ли кто-нибудь настолько любезен, чтобы сообщить мне, как… Приветствия / Ян Дженсен

 var Petmaturity = from p in PetsAgeDataTable
                         where p.Maturity != null // 
                         group p by new { p.Maturity, p.PetId } into gp
                   select new { Maturity = gp.Key.Maturity, Count = gp.Coeunt() };
 var element= Petmaturity.OrderByDescending(s => s.Count).First()
  

Ответ №1:

Предполагая, что ваш метод принимает лямбда:

 Func<Pet, T> getData
  

Попробуйте что-то вроде:

 public Tuple<T, int> GetMostCommonProperty<T>(IEnumerable<Pet> pets,
                                              Func<Pet, T> getData)
{
    var petGroups = from p in pets
                    let data = getData(p)
                    where data != null
                    group p by new { Data = data, p.PetId } into gp
                    select new { Data = gp.Key.Data, Count = gp.Count() };
    var element = petGroups.OrderByDescending(s => s.Count).First();

    return Tuple.Create(element.Data, element.Count);
}
  

Пример использования:

 Tuple<string, int> mostCommonName = GetMostCommonProperty(PetsAgeDataTable,
                                                          pet => pet.Name);
  

Обратите внимание, что здесь вам нужен общий возвращаемый тип (если это не всегда int ). На самом деле вы не можете вернуть анонимный тип, но вам нужно что-то вернуть. Здесь я выбрал кортеж, но у вас есть много вариантов, в зависимости от того, как вы собираетесь его использовать.

Комментарии:

1. да, но столбец зрелости в группировке не является genric. как это можно сделать? Здесь это вполне может быть другой столбец

2. @Jan — Смотрите обновление, оно должно скомпилироваться сейчас. :) . Возможно, у вас возникла проблема с data != null , вы можете использовать default(T) вместо этого или иметь значение в качестве параметра.

3. Мой код пока не использует c # 4.0 (мы будем там через несколько месяцев :)), какая еще альтернатива tuple у меня есть?

4. @Jan — Вы можете использовать KeyValuePair , и нетрудно написать простой кортеж самостоятельно. Другим вариантом является возврат T и использование count в качестве out параметра.

5. теперь 2 проблемы… Мой компилятор жалуется на let, а также можете ли вы опубликовать пример возврата <T>