2009-01-08 5 views
0

Je voudrais créer une méthode d'extension de somme sûre qui aurait la même syntaxe que la somme normale.Comment créeriez-vous une extension IList de sécurité int sum?

Ce serait la syntaxe que je voudrais utiliser:

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

J'utilise le Int.Maxvalue comme une valeur de pénalité dans mes opérations et deux Int.MaxValue résumé renvoie un ensemble Int.Maxvalue.

Ceci est ma fonction d'ajouter:

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

Toutes les idées?

EDIT:

Je voudrais utiliser cette fonction sur les collections génériques d'objets qui ont la valeur à résumer dans différentes propriétés:

-à-dire

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

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

Êtes-vous satisfait IList au lieu de IList non générique? –

Répondre

1

manière la plus simple de le faire:

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

BTW, PenaltySum échoue OMI: PenaltySum (-1, 0) retourne Int.MaxValue.

EDIT: Avec les exigences modifiées, vous voulez juste:

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

ou appelez source.Select(x => x.Cost).SumInt32Safe(); en premier lieu ...

+0

C'est OK. Les nombres négatifs ne sont pas autorisés en tant que pénalités. –

1

Il existe déjà une méthode d'extension qui vous aidera: Agréger

all.Aggregate(PenaltySum); 
+0

comment cela traiter avec le fait que j'ai besoin de faire la somme des coûts? –

+0

Vous avez dit que vous vouliez une méthode d'extension Sum et que PenaltySum était votre fonction d'ajout. Cela exécutera PenaltySum sur toutes les valeurs et retournera le résultat – JaredPar