你可以這樣做。雖然你的語法有點偏離。它應該是這樣的:
double sum = Calculate<double>(someFoo, f => f.a);
int count = Calculate<int>(someFoo, f => 1 + f.Length);
的方法是這樣的:
public T Calculate<T>(Foo foo, Func<Foo, T> calculator)
{
return calculator(foo);
}
然而,這一切並沒有真正意義的Foo
一個實例。更可能的是,someFoo
應該確實是someFoos
,即多個對象。此外,我想你也希望能夠指定聚合方法。
這將改變Calculate
這樣的:
public T Calculate<T>(IEnumerable<Foo> foo, Func<Foo, T> calculator,
Func<IEnumerable<T>, T> aggregate)
{
return aggregate(foo.Select(calculator));
}
用法:
List<Foo> someFoos = ...;
var sum = Calculate(someFoos, x => x.a, Enumerable.Sum)
var count = Calculate(someFoos, x => 1 + x.Length, Enumerable.Count)
使這一切遞歸,最簡單的辦法是有一個返回Foo
對象及其所有孩子的方法平面列表:
public IEnumerable<Foo> Flatten(Foo foo)
{
yield return foo;
foreach(var child in foo.Children.SelectMany(Flatten))
yield return child;
}
在Calculate
中使用此方法會導致:
public T Calculate<T>(IEnumerable<Foo> foo, Func<Foo, T> calculator,
Func<IEnumerable<T>, T> aggregate)
{
return aggregate(Flatten(foo).Select(calculator));
}
說了,寫這一切,我要問:你爲什麼不只是使用普通的LINQ?
Flatten(foo).Select(f => f.a).Sum();
Flatten(foo).Select(f => 1 + f.Length).Count();
我還不夠清楚。 「計算」功能會是什麼樣子? (我相信需要兩個動作。) – l33t 2013-02-26 09:59:43
@ l33t:請參閱更新。我想這就是你的意思。 – 2013-02-26 10:03:47