【问题标题】:How can I use linq to check if an flags/bitwise enumeration contains a type?如何使用 linq 检查标志/按位枚举是否包含类型?
【发布时间】:2010-10-07 05:24:16
【问题描述】:

以下 lambda 语句返回 null,而我希望它会返回一个字符串值。

var countryCode = AddressComponents
    .Where(x => x.AddressType == AddressType.Country)
    .Select(x => x.ShortName)
    .SingleOrDefault();

现在我正在查询的当前实例的 AddressType 属性包含以下数据:

AddressType.Political | AddressType.Country

所以它包含两个值。

当然,我的 lambda 不起作用,因为 country 的值(假设它是 1)!= 政治位或 Country 的值(假设它是 1 | 2 == 3)。

有什么想法吗?

我担心我需要一些非常丑陋的东西,比如......

((AddressTypes & AddressType.Country) == AddressType.Country)

.. 想法?

【问题讨论】:

    标签: .net linq enums lambda bit-manipulation


    【解决方案1】:

    .NET 4.0 有Enum.HasFlag方法:

    x => x.AddressType.HasFlag(AddressType.Country)
    

    如果您不在 .NET 4.0 上,bitwiseANDyou 有一个不错的选择。 如果您不喜欢该模式,请查看UnconstrainedMelody,它有一个为此目的的扩展方法。或者,您可以自己写一个;这个问题可能会有所帮助- Anyone know a good workaround for the lack of an enum generic constraint?

    【讨论】:

    • 严重吗?! /brb .... 哈哈哈哈弗克我 :) 它也是!赢。赢和el-winno-win!!!如果你想检查两个标志怎么办。例如 AddressType.Country 或 AddressType.Foo ?可以 HasFlag(AddressType.Country) | AddressType.Foo) 工作? (注意单个 PIPE 字符)
    • @Pure.Krome:是的,应该可以。来自 MSDN:“HasFlag 方法返回以下布尔表达式的结果:thisInstance And flag = flag”
    【解决方案2】:

    我敦促谨慎使用 .NET 4.0 中的 Enum.HasFlag。当我使用 ANTS 6.0 分析我的计算密集型应用程序时,这个函数出现在顶部附近。回到旧的手动位标志测试在我的情况下给出了 >100 的加速因子。在解决此 BCL 错误之前,请考虑一下自己的建议:

    using System;
    using System.Diagnostics;
    
    class Program
    {
        [Flags] enum test { flag1 = 1, flag2 = 2, flag4 = 4 }
    
        static void Main(string[] args)
        {
            Stopwatch s;
            test t = test.flag4;
    
            s = Stopwatch.StartNew();
            for (int c=0,i=0; i < 50000000; i++)
                if (t.HasFlag(test.flag2))
                    c++;
            Console.WriteLine(s.ElapsedMilliseconds);   // 22837 ms.
    
            s = Stopwatch.StartNew();
            for (int c=0,i=0; i < 50000000; i++)
                if ((t & test.flag2) > 0)
                    c++;
            Console.WriteLine(s.ElapsedMilliseconds);   // 172 ms.
        }
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多