你将如何创建一个安全的int和IList扩展?

时间:2009-01-08 15:16:00

标签: .net

我想创建一个安全的和扩展方法,它的语法与普通的Sum相同。

这将是我想要使用的语法:

result = Allocations.SumIntSafe(all => all.Cost);

我在我的操作中使用Int.Maxvalue作为惩罚值,并且两个Int.MaxValue总和一起返回Int.Maxvalue

这是我的添加功能:

public static int PenaltySum(int a, int b)
{
    return (int.MaxValue - a < b) ? int.MaxValue : a + b;
}

有什么想法吗?

修改

我想在具有要在不同属性中求和的值的对象的泛型集合上使用此函数:

all.SumInt32Safe(all => all.cost);

days.SumInt32Safe(day => day.penalty);

2 个答案:

答案 0 :(得分:1)

已经有一种可以帮助你的扩展方法:聚合

all.Aggregate(PenaltySum);

答案 1 :(得分:1)

最简单的方法:

public static int SumInt32Safe(this IList<int> source)
{
    long sum = source.Sum(x => (long) x);
    return (int) Math.Max(sum, (long) int.MaxValue);
}

顺便说一句,PenaltySum失败IMO:PenaltySum(-1,0)返回int.MaxValue。

编辑:根据需求的变化,你只需要:

public static int SumInt32Safe<T>(this IList<T> source, Func<T, int> selector)
{
    long sum = source.Sum(x => (long) selector(x));
    return (int) Math.Max(sum, (long) int.MaxValue);
}

或者首先致电source.Select(x => x.Cost).SumInt32Safe(); ......