3

私はこの列挙型フラグを持っています:

[Flags()]
public enum Levels
{
    Beginner, Medium, Advanced, Master
}

Bank と呼ばれるプロパティがあります。これは でDictionary<Levels, ...>、Levels は選択可能なオプションです。

KeyValuePair私の最初に次のものが含まれていると仮定しましょうKey = Levels.Beginner | Levels.Medium | Levels. Advanced。したがって、辞書に入力すると、Levels.MediumMedium が可能な値であるため、最後のオブジェクトが返されます。

public Worksheet LoadWorksheet(Levels level)
{
    Worksheet worksheet = new Worksheet(this.Bank[level].Value, this.Bank[level].Key);
    return worksheet;
}

残念ながら、これを行うと、キーが存在しないことを示すエラーがスローされます。キーを一致させるにはどうすればよいですか?

4

2 に答える 2

2

まず、次の場合に指摘する必要があります。

Levels keyA = Levels.Beginner | Levels.Medium | Levels. Advanced;
Levels keyB = Levels.Medium;

それから:

Debug.Assert(keyA.GetHashCode() != keyB.GetHashCode());
Debug.Assert(keyA != keyB);

ディクショナリで値を検索するとき、ディクショナリは最初にキーのハッシュ値を使用して正しいバケットを決定し、次に等式比較を使用してバケット内の正しいキーを識別します。

ハッシュ値が等しくない場合、キーは見つかりません。キー値が等しくない場合、値は見つかりません。

Levels.Medium次のLINQ式を使用して、キーにビットパターンが存在するかどうかを確認することにより、キーを含むすべてのエントリを取得できます。

var mediumEntries = Bank.Where(entry => 0 != ((int)entry.Key & (int)Levels.Medium));

または、@ Riaが指摘したように、.Net4ではHasFlagsメンバーを使用できます。

var mediumEntries = Bank.Where(entry => entry.Key.HasFlag(Levels.Medium));

別の回答(@ dasblinkenlight、@ Ria)で、これが機能するためには、列挙の値に重複しないビットパターンが必要であるという良い点があります。

[Flags()]        
public enum Levels        
{        
    Beginner = 0x01, 
    Medium = 0x02, 
    Advanced = 0x04, 
    Master = 0x08
}   
于 2012-07-15T05:12:00.447 に答える
0

列挙定数を2の累乗、つまり1、2、4、8などで定義します。これは、結合された列挙定数の個々のフラグが重複しないことを意味します。

[Flags]
public enum Levels
{
    Beginner = 1, 
    Medium = 2,
    Advanced = 4, 
    Master = 8
}

また、辞書キーを整数として定義する必要がありますDictionary<int, ...>int辞書に追加するときににキャストします。

Bank.Add((int) (Levels.Medium|Levels.Master), ...);

次に、キーと列挙型フラグを比較します。

if ((this.Bank[level].Key & Levels.Advanced) == Levels.Advanced)
{
     // Do something
}

.NET4を使用する場合は、HasFlag

if ( this.Bank[level].Key.HasFlag(Levels.Advanced) )
{
     // Do something
}

Dictionary.Key一意である必要があります。ArgumentExceptionそれ以外の場合は、重複するキーを追加しようとしたときにをスローします。フラグの列挙が提案されないようにしDictionary.Keyます。他の場所に保管してみてください。

于 2012-07-15T05:10:57.933 に答える