web-dev-qa-db-fra.com

LINQ: "contient" et une requête Lambda

J'ai un List<BuildingStatus> appelé buildingStatus. Je voudrais vérifier s'il contient un statut dont le code de caractère (renvoyé par GetCharCode()) est égal à une variable, v.Status.

Y a-t-il un moyen de le faire, à l'instar du code (non compilant) ci-dessous?

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

Utilisez Any() au lieu de Contains():

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

La méthode d'extension Linq Any pourrait fonctionner pour vous ...

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

Je ne sais pas exactement ce que vous recherchez, mais ce programme:

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

produit le résultat attendu:

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

Ce programme compare une représentation sous forme de chaîne de l'énum et produit le même résultat:

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

J'ai créé cette méthode d'extension pour convertir un IEnumerable en un autre, mais je ne suis pas certain de son efficacité. il peut simplement créer une liste dans les coulisses.

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

Ensuite, vous pouvez modifier la clause where en:

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

et sautez la création du List<string> avec ConvertAll () au début.

3
XXXXX

Voici comment utiliser Contains pour obtenir ce que vous voulez:

buildingStatus.Select(item => item.GetCharValue()).Contains(v.Status) cela retournera une valeur booléenne.

2
Soft-Brain