c# - 扩展方法,泛型 List<T> 上的 SumIf

标签 c# list generics extension-methods sum

我需要为 List(T) 编写一个通用扩展方法,该方法有条件地考虑 T 的每个字符串属性,然后在满足条件时对 T 的相应十进制属性求和。到目前为止我的努力:

// foreach(p in Persons) { if(p.Name == "mort"){sum p.Amount;} }

public static double SumIf<T>(this T o, List<T> ListItems, 
          string targetStr, ?strVals?, ?dblVals?)
{
    double sum = 0;
    foreach(T item in ListItems)
    {
        if(item.?strVal? == targetStr){ sum += item.?dblVal? ; }
    }
    return sum;
}

感谢您的指导, 死亡

最佳答案

听起来您想要一种提取字符串属性和 double 属性的方法(假设您帖子中的“小数”是拼写错误而不是代码中的“ double ”)- 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);

...但是更加灵活。

正如评论中所述,您真的需要这个吗?您是否在足够多的地方使用它来使简单的Where/Sum调用变得难以忍受?哎呀,你可以把它变成一个 Sum使用条件运算符调用:

double sum = list.Sum(x => x.Name == "mort" ? x => x.Amount : 0d);

关于c# - 扩展方法,泛型 List<T> 上的 SumIf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9754502/

相关文章:

c# - 如何使用 HTML Agility Pack 从网站检索所有图像?

Python矩阵(列表列表)到字典

c# - 对象到/从 XML : generic Load and Save

c#泛型,涵盖数组和列表?

c# - 使用泛型重载运算符

c# - 在Mysql数据库中存储数据列表?

c# - 根据相同字符串在列表中出现的频率使用 C# 对列表进行排序

c# - DataGridTemplateColumn 中的命令绑定(bind)

list - python : create a pandas data frame from a list

javascript - 在 JavaScript 中实现 `[1,2].contains(2)`