С# повторное использование выражения 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);