Vra

My kode het iets soos hierdie:

HttpFileCollection files

In plaas van herhaling deur middel van elke lêer en die toevoeging van die file.ContentLength om die totale lengte van al die inhoud te kry Bv.

        int totalLength = 0;
        for (int i = 0; i < files.Count; i++)
        {
            totalLength += files[i].ContentLength;
        }

Is daar 'n manier wat ek kan doen met 'n lambda uitdrukking so ek iets soos ..

int totalLength = files.[some sort of delegate here to do the addition].

Dankie by voorbaat.

Edit: HttpFileCollection het 'n GetEnumeratorMethod maar sou dit nodig het om te implementeer IEnumerable 'n lambda uitdrukking gebruik

Was dit nuttig?

Oplossing

Jy kan LINQ gebruik:

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

Ongelukkig HttpFileCollection se opnemer terug 'n opsomming van snare. Met die oog op die werklike voorwerpe (HttpPostedFile) kry, moet jy toegang tot die "woordeboek" deur sleutel. Dit vat die opnemer aan 'n opsomming van HttpPostedFile gevalle (via Select), som dan die inhoud lengte.

Ander wenke

Jy moet dit gooi, soos volg:

int totalLength = files.Cast<HttpPostedFile>().Sum(f => f.ContentLength);

Om toe te voeg tot die aanvaarde antwoord, wel, kan jy dit gebruik:

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

Die rede hoekom jy nie hoef te opnoemen in jou kode is omdat die som uitbreiding metode doen dit vir jou. As jy dit loop deur Reflector jy uiteindelik vind hierdie stukkie kode:

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

As jy sien, dit is nie regtig rocketscience. Dit is amper dieselfde as die oorspronklike kode aand!

Let wel: As jy wil hierdie kode te vind, kraak oop System.Core, gaan na die System.Linq naamruimte en open die enumerable klas definisie. Jy sal hierdie metodes hier vind (onder andere dink ek).

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top