あなたは、文字列プロパティと二重のプロパティを抽出する方法をしたいようですが、(あなたのポストで「小数」はあったと仮定して聞こえます)あなたのコード内で「ダブル」のではなく、タイプミス - 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;
}
(私は未使用の初期パラメータを削除したことに注意してください、そしてそれを、リスト自体の拡張メソッドを作っ使用していません。価値はabのように感じる私には臭いのそれあなたが本当にリストであることを、それを必要としないよう...私はまた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呼び出しを耐え難いほどにするために十分な場所で使用していますか?あなたは、それは、例えば、一般的なことができないことをそれを作るあなたの方法にいくつかの非常に特定の制約を導入
double sum = list.Sum(x => x.Name == "mort" ? x => x.Amount : 0d);
上記の方法はあなたを与えるん何が問題? –
['Aggregate'](http://msdn.microsoft.com/library/system.linq.enumerable.aggregate.aspx)は機能しませんか?または['Where'](http://msdn.microsoft.com/library/system.linq.enumerable.where.aspx)に続いて[' Sum'](http://msdn.microsoft.com/library/system .linq.enumerable.sum.aspx)?または、ヘルパー拡張メソッドが必要ですか? – BACON