С# повторное использование выражения LINQ для разных свойств одного и того же типа
У меня есть класс с несколькими свойствами int
:
class Foo
{
string bar {get; set;}
int a {get; set;}
int b {get; set;}
int c {get; set;}
}
У меня есть выражение LINQ, которое я хочу использовать на List<Foo>
. Я хочу, чтобы иметь возможность использовать это выражение для фильтрации/выбора из списка, глядя на любое из трех свойств. Например, если бы я фильтровался с помощью a
:
return listOfFoo.Where(f => f.a >= 0).OrderBy(f => f.a).Take(5).Select(f => f.bar);
Однако я хочу иметь возможность сделать это с любым из f.a
, f.b
или f.c
. Вместо того, чтобы повторно вводить выражение LINQ 3 раза, я хотел бы иметь некоторый метод, который бы принял аргумент, чтобы указать, какой из a, b или c я хочу фильтровать, а затем вернуть этот результат.
Есть ли способ сделать это на С#? Ничто не приходит на ум сразу, но это похоже на то, что должно быть возможно.
Ответы
Ответ 1
IEnumerable<string> TakeBarWherePositive(IEnumerable<Foo> sequenceOfFoo, Func<Foo, int> intSelector) {
return sequenceOfFoo
.Where(f => intSelector(f) >= 0)
.OrderBy(intSelector)
.Take(5)
.Select(f => f.bar);
}
Затем вы бы назвали
var a = TakeBarWherePositive(listOfFoo, f => f.a);
var b = TakeBarWherePositive(listOfFoo, f => f.b);