.net 如何创建安全的int-sum IList扩展?

.net 如何创建安全的int-sum IList扩展?,.net,.net,我想创建一个安全和扩展方法,它的语法与普通和相同 这就是我想要使用的语法: 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.Ma

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

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

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;
}

已经有一个扩展方法可以帮助您:Aggregate

all.Aggregate(PenaltySum);

最简单的方法是:

public static int SumInt32Safe(this IList<int> source)
{
    long sum = source.Sum(x => (long) x);
    return (int) Math.Max(sum, (long) int.MaxValue);
}
public static int SumInt32Safe(此IList源代码)
{
longsum=source.sum(x=>(long)x);
返回(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);
}
public static int SumInt32Safe(此IList源代码,Func选择器)
{
longsum=source.sum(x=>(long)选择器(x));
返回(int)Math.Max(sum,(long)int.MaxValue);
}

或者调用
source.Select(x=>x.Cost.SumInt32Safe()首先…

您对IList而不是非泛型IList满意吗?没关系。负数不允许作为惩罚。这将如何处理我需要对成本进行求和的事实?你说过你想要一个求和扩展方法,PenaltySum是你的加法函数。这将对所有值运行PenaltySum并返回结果
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);
}