13

次のように、[Flags]属性でマークされた列挙型があります。

[Flags]
public enum Tag : int
{
    None = 0,
    PrimaryNav = 1,
    HideChildPages = 2,
    HomePage = 4,
    FooterLink = 8
}

サイトマップのsitemapnodesに、タグの組み合わせのint値を属性として格納します。

私がする必要があるのは、ノードに1つ以上のタグのいずれかがあるかどうかを確認することです。Tag.HomePage。

列挙型の値に比較対象の値が1つ以上あるかどうかを判断するために、必要なブール論理に苦労しています。

これが明確でない場合はお詫び申し上げます。必要に応じて、より多くの情報を提供できます。

4

8 に答える 8

28

と値を組み合わせて|、を介してチェックすることで、これを行うことができます&

値にいずれかのタグが含まれているかどうかを確認するには、次のようにします。

if ((myValue & (Tag.PrimaryNav | Tag.HomePage)) != 0) { ... }

|、テストしている列挙型(ビット単位)と&ビット単位のマスキングによるテストを組み合わせたものです。結果がゼロでない場合は、少なくとも1つが設定されています。

両方が設定されているかどうかをテストする場合は、次のようにすることもできます。

Tag desiredValue = Tag.PrimaryNav | Tag.HomePage;
if ((myValue & desiredValue) == desiredValue) { ... }

ここでは、気にしないものをすべてマスクし、結果の値が気になる値と等しいことをテストしていますどちらの!= 0値にも一致するため、以前のように使用することはできません。ここでは両方に関心があります)。

いくつかのリンク:

于 2010-03-09T12:45:57.157 に答える
9

HasFlagメソッドを使用して、ブール論理の必要性を回避できます。

Tag Val = (Tag)9;

if (Val.HasFlag(Tag.PrimaryNav))
{
    Console.WriteLine("Primary Nav");
}

if(Val.HasFlag(Tag.HomePage))
{
    Console.WriteLine("Home Page");
}
于 2010-03-09T12:50:26.457 に答える
2

ビット単位の(Flags)列挙型の場合、「any of」テストは!= 0であるため、次のようになります。

const Tag flagsToLookFor = Tag.PrimaryNav | Tag.HomePage;
if ((node.Tag & flagsToLookFor) != 0) {
    // has some cross-over with PrimaryNav or HomePage (and possibly others too) 
}
于 2010-03-09T12:48:30.960 に答える
1
var someEnumValue = Tag.PrimaryNav | Tag.HomePage;

列挙型に特定の値が含まれているかどうかをテストするには、次のようにします。

if ((someEnumValue & Tag.PrimaryNav) == Tag.PrimaryNav)
{

}
于 2010-03-09T12:45:32.383 に答える
1
var tag = Tag.HideChildPages | Tag.PrimaryNav;

If ((tag & Tag.PrimaryNav) == Tag.PrimaryNav) {
    // Tag.PrimaryNav set.
}
于 2010-03-09T12:45:51.853 に答える
1

JonSkeetのUnconstrainedMelodyライブラリを使用できます。

var someEnumValue = Tag.PrimaryNav | Tag.HideChildPages;
someEnumValue.HasAny(Tag.PrimaryNav | Tag.HomePage); // Returns true
于 2010-03-09T12:52:24.600 に答える
0

この拡張メソッドは、任意のタイプの列挙型の列挙型で使用できます。

public static bool IsSingle(this Enum value)
    {
        var items = Enum.GetValues(value.GetType());
        var counter = 0;
        foreach (var item in items)
        {
            if (value.HasFlag((Enum)item))
            {
                counter++;
            }
            if (counter > 1)
            {
                return false;
            }
        }
        return true;
    }
于 2016-09-28T07:02:38.293 に答える
0

これは古典的な拡張メソッドです。

    public static bool HasFlag(this Enum val, Enum t)
    {
            return (Convert.ToUInt64(val) & Convert.ToUInt64(t)) != 0;
    }
于 2020-10-13T13:32:42.423 に答える