ラムダ式を使用してHttpFileCollectionの計算含有量の合計長
-
24-09-2019 - |
質問
私のコードは次のようなものを持っています
HttpFileCollection files
の代わりに、すべてのコンテンツの合計の長さを取得するためにfile.ContentLengthを各ファイルをループして合算の例えばます。
int totalLength = 0;
for (int i = 0; i < files.Count; i++)
{
totalLength += files[i].ContentLength;
}
私は..
のようなものを持っているので、私はラムダ式でこれを行うことができます方法はありますint totalLength = files.[some sort of delegate here to do the addition].
事前に感謝します。
編集:?HttpFileCollectionはGetEnumeratorMethodを持っていますが、それは、ラムダ式を使用するためにIEnumerableをを実装する必要があります。
解決
あなたは、LINQを使用することができます:
int totalLength = files.AllKeys.Select(k => files[k]).Sum(f => f.ContentLength);
残念ながら、HttpFileCollectionの列挙子は、文字列の列挙を返します。実際のオブジェクト(HttpPostedFile)を取得するためには、キーで「辞書」にアクセスする必要があります。 HttpPostedFileの列挙には、この変換列挙子インスタンス(選択を介して)、次いで、コンテンツの長さを合計する。
他のヒント
あなたはこのように、それをキャストする必要があります:
int totalLength = files.Cast<HttpPostedFile>().Sum(f => f.ContentLength);
は確かに、あなたはこれを使用することができ、受け入れ答えに追加するには
int totalLength = files.AllKeys.Select(k => files[k]).Sum(f => f.ContentLength);
和の拡張メソッドは、あなたのためにそれを行うため、あなたのコードで列挙することはありません理由です。あなたはリフレクターを通してそれを実行する場合は、最終的にこのコードのビットを見つけます:
public static int Sum(this IEnumerable<int> source)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
int num = 0;
foreach (int num2 in source)
{
num += num2;
}
return num;
}
ご覧のとおり、は、それが本当にrocketscienceではありません。それはほぼ元のコードと同じだとしても!
注:このコードを検索する場合、System.Linqの名前空間に移動し、列挙クラス定義を開き、オープンSystem.Coreをクラック。あなたは(他の場所の中で、私は思う)、ここで、これらの方法を見つけることができます。
所属していません StackOverflow