2

私のコードは次のようなものです:

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を実装する必要がありますか?

4

2 に答える 2

6

LINQを使用できます:

int totalLength = files.AllKeys.Select(k => files[k]).Sum(f => f.ContentLength);

残念ながら、HttpFileCollectionの列挙子は文字列の列挙を返します。実際のオブジェクト(HttpPostedFile)を取得するには、キーで「辞書」にアクセスする必要があります。これにより、列挙子が(Selectを介して)HttpPostedFileインスタンスの列挙型に変換され、コンテンツの長さが合計されます。

于 2010-03-04T16:36:22.533 に答える
1

受け入れられた答えに追加するには、確かに、これを使用することができます:

int totalLength = files.AllKeys.Select(k => files[k]).Sum(f => f.ContentLength);

コードで列挙する必要がない理由は、Sum拡張メソッドが列挙するためです。Reflectorを介して実行すると、最終的に次のコードが見つかります。

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

ご覧のとおり、それは実際にはロケットサイエンスではありません。元のコードとほとんど同じです!

注:このコードを見つけたい場合は、System.Coreをクラックして開き、System.Linq名前空間に移動して、Enumerableクラス定義を開きます。これらの方法はここにあります(私が思う他の場所の中でも)。

于 2010-03-04T16:54:45.253 に答える