Примечание: пожалуйста, пометите и / или переименуйте соответствующим образом
У меня есть класс FooEnumerator
, который упаковывает Foo
и реализует IEnumerable<FooEnumerator>
.Foo
s представляют древовидную структуру данных, перечисленные FooEnumerator
являются дочерними узлами текущего узла.
Foo
- предоставленный поставщиком объект данных.FooEnumerator
реализует связку пользовательского кода фильтрации.
class FooEnumerator : IEnumerable<FooEnumerator>
{
public Foo WrappedNode { get; private set; }
public string Name { get { return WrappedNode.Name; } }
public int Id { get{ return WrappedNode.Id; } }
public DateTime Created { get{ return WrappedNode.Created; } }
public FooEnumerator(Foo wrappedNode)
{
WrappedNode = wrappedNode;
}
public IEnumerator<FooEnumerator> GetEnumerator()
{
foreach (Foo child in this.GetChildren())
if(FilteringLogicInHere(child))
yield return new FooEnumerator(child);
}
...
}
Я хочу иметь возможность сортировать каждый уровень дерева по заданному (произвольному) выражению, определенному при создании верхнего уровня FooEnumerator
и передать это выражение каждому вновь перечисленному элементу для использования.
Я бы хотел определить выражение сортировки, используя лямбда-выражения, так же, как вы бы использовали функцию OrderBy.Фактически, я намерен передать лямбду на OrderBy
.
. Подпись для OrderBy:
OrderBy<TSource, TKey>(Func<TSource, TKey> keySelector)
, где TKey
- это тип возвращаемого значения Func
, но является параметром типа в сигнатуре метода и вычисляется во время компиляции.
Пример использования
var x = GetStartingNode();
var sort = n => n.DateTime;
var enu = new FooEnumerator(x, sort);
var sort2 = n => n.Name;
var enu2 = new FooEnumerator(x, sort2);
Затем выражение сортировки будет сохранено в переменной класса и FooEnumerator
будет работать как:
// pseudo-implementation
private Expression<Func<Foo, TKey>> _sortBy;
public FooEnumerator(Foo wrappedNode, Expression<Func<Foo, TKey>> sortBy)
{
WrappedNode = wrappedNode;
_sortBy = sortBy;
}
public IEnumerator<FooEnumerator> GetEnumerator()
{
foreach (Foo child in this.GetChildren().OrderBy(_sortBy))
if(FilteringLogicInHere(child))
yield return new FooEnumerator(child);
}
Как я могу указать тип TKey (неявно или явно) в этом случае использования?
Я не хочу труднозакодируйте его так, как я хочу, чтобы иметь возможность сортировать любые и все свойства базового Foo
.