2011-02-03 16 views
0

私はつもりが正常例えば、修飾キーの状態でSystem.Windows.Input.Key値をハッシュだハッシュアルゴリズムを記述しようとしています:修飾子キーの状態でSystem.Windows.Input.Keyの値を正しくハッシュする方法

ctrl = false 
shift = true 
alt = false 
capslock = true 
numlock = false 
scroll lock = false 
key: A 

したがって、このようなキーの値が異なると他の人から分離されなければなりませんctrl、shift、altなどの状態がありますが、これらは真または偽であるため、ハッシュ値を区別する方法はわかりません。

アイデア?すべての可能なキーの組み合わせを処理できるだけのユニークさでなければなりません。

+1

"Distinct"と "hash"は水と火です。ハッシュ関数は異なる値を約束しません*。 –

答えて

1

は、私のような、それ自身のハッシュコードを計算することができ、すべての値を含むクラスを構築します:this Jon Skeet's answer

class KeyInfo : IEquatable<KeyInfo> 
    { 
     public bool Ctrl { get; private set; } 
     public bool Shift { get; private set; } 
     public bool Alt { get; private set; } 
     public bool CapsLock { get; private set; } 
     public bool NumLock { get; private set; } 
     public bool ScrollLock { get; private set; } 
     public Keys Key { get; private set; } 

     public KeyInfo(bool ctrl, bool shift, bool alt, bool capsLock, bool numLock, bool scrollLock, Keys key) 
     { 
      this.Ctrl = ctrl; 
      this.Shift = shift; 
      this.Alt = alt; 
      this.CapsLock = capsLock; 
      this.NumLock = numLock; 
      this.ScrollLock = scrollLock; 
      this.Key = key; 
     } 

     public override bool Equals(object obj) 
     { 
      return this.Equals(obj as KeyInfo); 
     } 

     public bool Equals(KeyInfo other) 
     { 
      if (other == null) 
       return false; 
      return this.Ctrl == other.Ctrl && this.Shift == other.Shift && 
        this.Alt == other.Alt && this.CapsLock == other.CapsLock && 
        this.NumLock == other.NumLock && this.ScrollLock == other.ScrollLock && 
        this.Key == other.Key; 
     } 

     public override int GetHashCode() 
     { 
      unchecked 
      { 
       int hash = 17; 
       hash = hash * 23 + this.Ctrl.GetHashCode(); 
       hash = hash * 23 + this.Shift.GetHashCode(); 
       hash = hash * 23 + this.Alt.GetHashCode(); 
       hash = hash * 23 + this.CapsLock.GetHashCode(); 
       hash = hash * 23 + this.NumLock.GetHashCode(); 
       hash = hash * 23 + this.ScrollLock.GetHashCode(); 
       hash = hash * 23 + this.Key.GetHashCode(); 
       return hash; 
      } 
     } 
    } 

クレジットをGetHashCode()実装のために。

N.B.

このクラスは有効HashSetにまたはLINQ Distinct()及び他のLINQセット操作で、Dictionaryキーとして使用することができます。

編集:私はあなたがハッシュコードとして辞書のキーを使用していますが、その代わり全体クラスを使用してはならないという事実を強制したい


hashingにはcollisionsが付いているので、ハッシュコードの一意性に頼ることはできません。

+0

digEmAllさん、ありがとうございました。 boolが特定のGetHashCode実装を単独で持っているかどうか知っていますか? –

+1

はい、falseの場合は0、trueの場合は1を返します。 – digEmAll

+0

私の編集を見てください(おそらく無駄ですが、確かに...); – digEmAll

関連する問題