听起来您想要一种提取字符串属性和双精度属性的方法(假设您帖子中的“十进制”是错字而不是代码中的“双精度”)-Func 在这里是合适的:
public static double SumIf<T>(this IEnumerable<T> source,
string targetText,
Func<T, string> textSelector,
Func<T, double> valueSelector)
{
double sum = 0;
foreach (T item in source)
{
if (textSelector(item) == targetText)
{
sum += valueSelector(item);
}
}
return sum;
}
(请注意,我已经删除了未使用的初始参数,并将其作为列表本身的扩展方法。不使用该值对我来说感觉有点异味......我还更改了参数类型到IEnumerable<T>,因为你真的不需要它是一个列表。)
请注意,这实际上几乎等同于:
public static double SumIf<T>(this IEnumerable<T> source,
string targetText,
Func<T, string> textSelector,
Func<T, double> valueSelector)
{
return source.Where(x => textSelector(x) == targetText)
.Sum(valueSelector);
}
我个人可能会选择通用谓词函数而不是字符串和文本选择器:
public static double SumIf<T>(this IEnumerable<T> source,
Func<T, bool> predicate,
Func<T, double> valueSelector)
{
return source.Where(predicate)
.Sum(valueSelector);
}
然后你会调用它
double sum = list.SumIf(x => x.Name == "mort", x => x.Amount);
...这对我来说似乎和以下一样好:
double sum = list.SumIf("mort", x => x.Name, x => x.Amount);
...但要灵活得多。
正如 cmets 中所述,您真的需要这个吗?您是否在足够多的地方使用它以使简单的 Where/Sum 调用难以忍受?哎呀,您可以使用条件运算符将其转换为 Sum 调用:
double sum = list.Sum(x => x.Name == "mort" ? x => x.Amount : 0d);