#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>