LINQ:“包含”和LAMBDA查询(LINQ: “contains” and a Lambda q

2019-07-28 13:58发布

我有一个List<BuildingStatus>称为buildingStatus 。 我想检查它是否包含状态,其字符代码(由返回GetCharCode()等于某个变量, v.Status

是否有这样做的一些方法,沿下方的(非编译)代码的行?

buildingStatus.Contains(item => item.GetCharValue() == v.Status)

Answer 1:

使用Any()而不是Contains()

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


Answer 2:

LINQ的扩展方法的任何可能为你工作?

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


Answer 3:

我不知道你要找正是为,但此程序:

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

产生预期的输出:

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

该程序比较枚举的字符串表示,并产生相同的输出:

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

我创造了这个扩展方法IEnumerable的一个转换为另一种,但我不知道它是如何高效; 它可能只是在后台创建一个列表。

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

然后,您可以更改where子句:

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

和跳过创建List<string>ConvertAll ()开头。



Answer 4:

这里是你如何使用Contains实现你想要什么:

buildingStatus.Select(item => item.GetCharValue()).Contains(v.Status)这将返回一个布尔值。



Answer 5:

如果我理解正确的话,你需要转换在建筑列表,您在buildingStatus列表存储类型(ENUM)存储类型(char值)。

(在建筑列表//字符值//每个状态,不存在于buildingStatus列表//枚举值状态//)

public static IQueryable<Building> WithStatus(this IQueryable<Building> qry,  
IList<BuildingStatuses> buildingStatus) 
{ 
    return from v in qry
           where ContainsStatus(v.Status)
           select v;
} 


private bool ContainsStatus(v.Status)
{
    foreach(Enum value in Enum.GetValues(typeof(buildingStatus)))
    {
        If v.Status == value.GetCharValue();
            return true;
    }

    return false;
}


文章来源: LINQ: “contains” and a Lambda query