0

私は列挙型を持っているとします:

public enum ItemStatus {
    Available, Unavailable
}

フィルターに基づいて、これらのテレビのリストを返すメソッドがあります。また、フィルターは Enum で表されます。

[Flags]
public enum ItemStatusFilter {
    Available = 1, Unavailable = 2
}

質問: ItemStatus の特定のインスタンスが ItemStatusFilter の特定のインスタンスと一致するかどうかを確認する巧妙な方法は何ですか?

ItemStatus メンバー (1,2) に値を割り当てるという考えは嫌いです。その列挙では必要ないからです。現在、私のコードは次のようになっています。

public static bool Matches(this TagStatusFilter statusFilter, TagStatus status) {
  if (status == TagStatus.Available && ((statusFilter & TagStatusFilter.Available) != 0)) return true;
  if (status == TagStatus.Unavailable && ((statusFilter & TagStatusFilter.Unavailable) != 0)) return true;
  return false;
}

これらの線に沿ったものはどうですか?

[Flags]
public enum TagStatusFilter {
    Available = 1 << TagStatus.Available,
    Unavailable = 1 << TagStatus.Unavailable
}

目標は、コードの量を減らし、型間の結合を減らすことです。

enum TagStatusFilterここで悪用されているように感じますか?

4

3 に答える 3

0

私はそれが好きではありません..しかし、それは動作します:

        foreach (tv t in tvs)
        {
            if (isf.ToString().Contains(t.Status.ToString()))
            {
                //match
                Console.WriteLine("matched");
            }
        }
于 2009-09-24T15:47:03.023 に答える
0

フラグ属性を使用する場合は、ビットごとの操作を使用できます。これについてブログ記事を書きました。

http://ehsanghanbari.com/Post/86/why-the-values-of-enums-are-bit-flag-in-net

于 2014-01-26T20:09:43.710 に答える
-1

2 つの列挙型の属性のみが異なる場合は、フィルタリングタイプ[Flag]に使用できます。IEnumerable<ItemStatus>

したがって、2 つの列挙型を使用する強い理由がある場合は、次の方法でフィルタリングする方がよいでしょう。

public bool Matches(ItemStatusFilter statusFilter, ItemStatus status)
{
    return ((int)statusFilter & (int)status) > 0;
}
于 2013-06-24T13:19:02.120 に答える