2017-11-04 9 views
0
SortedDictionary<Color, int> bucket = new SortedDictionary<Color, int>(new MyComparer()); 

     for (int col = 0; col < image.Width; col++) 
     { 
      for (int row = 0; row < image.Height; row++) 
      { 
       Color c = image.GetPixel(col, row); 

       if (bucket.ContainsKey(c)) 
        bucket[c]++; 
       else 
       { 
        if (c == Color.FromArgb(255, 0, 15, 12)) 
         MessageBox.Show("First time " + c + " " + bucket.ContainsKey(c)); 
        bucket.Add(c, 1); 
       } 
      } 
     } 

しかし、MessageBoxは2回表示されます(通常のデジタル画像の場合)。その後、私は何かをしたい場合カラーキーでソート済み

SortedDictionary<Color, int> newBucket = new SortedDictionary<Color, int>(bucket, new ColorComparer(channel)); 

"私は同じキーを持つ項目が既に追加されています。"しかし、私は上のコードでそれをチェックし、Falseを返します。何か不足していますか?

btw。色が等しく、その後x.R == y.RCompare(x, y)リターン-1されていない場合ので、MyComparer

class MyComparer : IComparer<Color> 
{ 
public int Compare(Color x, Color y) 
     { 
       if (x == y) 
        return 0;         
       else if (x.R > y.R) 
        return 1; 
       else 
        return -1;    
     } 
} 
+0

あなたの比較のすべての 'Color'フィールドを比較する必要がありますhttps://stackoverflow.com/questions/4501501/custom-sorting-icomparer-on-three-fields – Kostya

+0

@KostyaK Oh、それは働いています、ありがとうございました。私は、colorA == colorBだと思っていました。まあとにかく...ありがとうございました:) – Reenergy

+0

問題ありません。 :))) – Kostya

答えて

0

私は、辞書が混乱してしまうと思います。後で挿入プロセスの場合、辞書は同じ値を逆順に再度比較します。Compare(y, x)-1を再度返しますが、前の結果と一致するように、+1を返します。したがって、辞書は壊れてしまいます。

つまり、a > bの場合、b < aも真でなければなりません。または比較者:Compare(a, b) == -Compare(b, a)がtrueである必要があります。

比較演算の一貫性を保つために唯一の方法は、あなたが注文の赤い色にのみ関心がある場合でも、(すべてのカラーチャンネルを比較することです例:。

class MyComparer : IComparer<Color> 
{ 
    public int Compare(Color x, Color y) 
    { 
     if (x.R > y.R) return +1; 
     if (x.R < y.R) return -1; 
     return x.ToArgb().CompareTo(y.ToArgb()); 
    } 
} 

別の可能性は、唯一の店にありますSortedDictionary<byte, int>

+0

KostyaKのソリューションは私のために働くが、あなたは私に良い情報を与える、感謝:) – Reenergy

関連する問題