it-swarm.com.de

LINQ: "enthält" und eine Lambda-Abfrage

Ich habe einen List<BuildingStatus> Namens buildingStatus. Ich möchte überprüfen, ob es einen Status enthält, dessen Zeichencode (zurückgegeben von GetCharCode()) einer Variablen entspricht, v.Status.

Gibt es eine Möglichkeit, dies in Anlehnung an den folgenden (nicht kompilierenden) Code zu tun?

buildingStatus.Contains(item => item.GetCharValue() == v.Status)
154
mark smith

Verwenden Sie Any() anstelle von Contains():

buildingStatus.Any(item => item.GetCharValue() == v.Status)
292
Rex M

Die Linq-Erweiterungsmethode Any könnte für Sie funktionieren ...

buildingStatus.Any(item => item.GetCharValue() == v.Status)
37
flq

Ich weiß nicht genau, wonach Sie suchen, aber dieses Programm:

    public class Building
    {
        public enum StatusType
        {
            open,
            closed,
            weird,
        };

        public string Name { get; set; }
        public StatusType Status { get; set; }
    }

    public static List <Building> buildingList = new List<Building> ()
    {
        new Building () { Name = "one", Status = Building.StatusType.open },
        new Building () { Name = "two", Status = Building.StatusType.closed },
        new Building () { Name = "three", Status = Building.StatusType.weird },

        new Building () { Name = "four", Status = Building.StatusType.open },
        new Building () { Name = "five", Status = Building.StatusType.closed },
        new Building () { Name = "six", Status = Building.StatusType.weird },
    };

    static void Main (string [] args)
    {
        var statusList = new List<Building.StatusType> () { Building.StatusType.open, Building.StatusType.closed };

        var q = from building in buildingList
                where statusList.Contains (building.Status)
                select building;

        foreach ( var b in q )
            Console.WriteLine ("{0}: {1}", b.Name, b.Status);
    }

erzeugt die erwartete Ausgabe:

one: open
two: closed
four: open
five: closed

Dieses Programm vergleicht eine Zeichenfolgendarstellung der Aufzählung und erzeugt die gleiche Ausgabe:

    public class Building
    {
        public enum StatusType
        {
            open,
            closed,
            weird,
        };

        public string Name { get; set; }
        public string Status { get; set; }
    }

    public static List <Building> buildingList = new List<Building> ()
    {
        new Building () { Name = "one", Status = "open" },
        new Building () { Name = "two", Status = "closed" },
        new Building () { Name = "three", Status = "weird" },

        new Building () { Name = "four", Status = "open" },
        new Building () { Name = "five", Status = "closed" },
        new Building () { Name = "six", Status = "weird" },
    };

    static void Main (string [] args)
    {
        var statusList = new List<Building.StatusType> () { Building.StatusType.open, Building.StatusType.closed };
        var statusStringList = statusList.ConvertAll <string> (st => st.ToString ());

        var q = from building in buildingList
                where statusStringList.Contains (building.Status)
                select building;

        foreach ( var b in q )
            Console.WriteLine ("{0}: {1}", b.Name, b.Status);

        Console.ReadKey ();
    }

Ich habe diese Erweiterungsmethode erstellt, um einen IEnumerable in einen anderen zu konvertieren, bin mir jedoch nicht sicher, wie effizient sie ist. es kann nur eine Liste hinter den Kulissen erstellen.

public static IEnumerable <TResult> ConvertEach (IEnumerable <TSource> sources, Func <TSource,TResult> convert)
{
    foreach ( TSource source in sources )
        yield return convert (source);
}

Dann können Sie die where-Klausel wie folgt ändern:

where statusList.ConvertEach <string> (status => status.GetCharValue()).
    Contains (v.Status)

und überspringen Sie die Erstellung des List<string> mit ConvertAll () am Anfang.

3
XXXXX

So können Sie mit Contains das erreichen, was Sie wollen:

buildingStatus.Select(item => item.GetCharValue()).Contains(v.Status) gibt einen Booleschen Wert zurück.

2
Soft-Brain