2016-09-27 6 views
1

私はこれらの方法を持っています。あなたは他の番号タイプについてもそうするかもしれないと思うかもしれません。これらのメソッドを1つの汎用メソッドにマージする方法はありますか?ここで汎用メソッドを使用するにはどうすればよいですか?

public T GetActiveDepartmentsQuotaOf<T> (Func<Department, T> exp) 
{ 
    return Departments == null ? 0 : Departments.Where(d => d.Status == 1).Sum(exp); 
} 

しかし、間違った構文的に:

public long GetActiveDepartmentsQuotaOf (Func<Department, long> exp) 
{ 
    return Departments == null ? 0 : Departments.Where(d => d.Status == 1).Sum(exp); 
} 

public int GetActiveDepartmentsQuotaOf (Func<Department, int> exp) 
{ 
    return Departments == null ? 0 : Departments.Where(d => d.Status == 1).Sum(exp); 
} 

は、私はこれを試してみました。この状況から脱出する方法は何ですか?私は Enumerable.Sum方法のみまとめることができ、特定のタイプ(例えば intdoublefloat)のIEnumerables上で動作しますので、これは、動作しません

+2

はちょうどタイプミスか、 'TGetActiveDepartmentsQuotaOf'から' T'を分けてみましたか? –

+0

最初の2つの方法と同じように['Sum()'自体は複数のオーバーロードで実装されています](https://msdn.microsoft.com/en-us/library/bb548890(v=vs.110).aspx)。あなたは 'T:intかT:longかT:doubleか'と言うことはできませんが、 'ISummable 'または 'IAddable '( 'IEquatiable ' 。あなたはちょうどここからそこに着くことができません(反射を伴う醜いもの以外)。私は一度はできることを望んできました。 –

答えて

3

だけ興味があります。

ここでは完全なオーバーロードリストです:https://msdn.microsoft.com/en-us/library/system.linq.enumerable.sum(v=vs.110).aspx

あなたがTは何もすることができIEnumerable<T>をまとめるだろうか不明です。例えば、TDepartmentであるとします。あなたは何を期待しますか.Sum()はその場合に戻りますか?

+0

私は@Mong Zhu'sのような答えを探していました。特定のタイプに使用を制限する条件。しかしそれでも同じエラーが出ます。したがって、私は多くのオプションを持っていません。多くの方法を使用するか、romain-agaが示唆するように変換を受け入れます。 –

1

これは機能しますか?

public T GetActiveDepartmentsQuotaOf<T>(Func<Department, double> exp) 
    where T : IConvertible 
{ 
    return (T)Convert.ChangeType(Departments == null 
     ? 0 : Departments.Where(d => d.Status == 1).Sum(exp), typeof(T)); 
} 

編集:(あなたには、いくつかの小数を持つことができる場合は、二重のか)あなたのラムダ(またはメソッド)の戻り値を終了

で参照してくださいしかし、あなたはint型に変換する必要があります。

public T GetActiveDepartmentsQuotaOf<T>(Func<Department, T> exp) 
    where T : IConvertible 
{ 
    return (T)Convert.ChangeType(Departments == null 
      ? 0 
      : Departments.Where(d => d.Status == 1) 
       .Sum(d => (int)Convert.ChangeType(exp(d), typeof(double))) 
     , typeof(T)); 
} 

編集:私は(私の溶液中で倍増するint型から型を変更するため、@のServyさんのコメントにあなたが本当にFunc<Department, T>署名が必要な場合は


EDIT

)、誰も小数点をサポートするための変更によって混乱しないようにする必要があります。少なくとも今では、整数と小数点のどちらも機能するはずです。 小数点以下の桁数を使用すると精度が低下することにご注意ください。

+0

これは非整数値の正しい合計を計算するつもりはなく、悪いことには、これを示すものではありません。たとえそうでないとしても、シグネチャは変換可能なタイプを適切に合計することを意味します。 – Servy

+0

なぜか、私は10進数を計算する必要がある場合、2倍に変えることができると言いました;)しかし、私が書いた解決策は小数点では機能しません。あなたはこれを言って以来、私はそのタイプを交換します、少なくとも混乱はもうけられません。 –

+0

あなたが選んだものは問題ではありませんが、そのポイントは* all *ではなく* one * typeのみをサポートできる点です。整数の和から二重の合計に変更すると、非二重和では機能しません。小数点を使用するように変更すると、小数点以下の小数点では機能しません。正確な結果を確実に得るためには、実際の型自体に基づいて合計を使用する必要があります。 – Servy

関連する問題