3

データベースには、 unique で識別されるさまざまなオブジェクトがありますSystem.Guid's。それらを表示するときは、GUID に基づいてそれぞれに固有の色を付けたいと思います。

だから私はこのようなものが欲しい:

public Color ColorFromGuid(Guid guid) { /* ?? */ }

どこ

ColorFromGuid(databaseObject1.Guid) == ColorFromGuid(databaseObject1.Guid)
ColorFromGuid(databaseObject2.Guid) == ColorFromGuid(databaseObject2.Guid)
ColorFromGuid(databaseObject1.Guid) != ColorFromGuid(databaseObject2.Guid)

これを行う最良の方法は何ですか?

編集明らかに、色よりもはるかに多くの一意のGUIDがあるため、すべての GUID が独自の一意の色を持つ方法はありません。良い品種を探しています。

4

5 に答える 5

4

あなたができること:

return Color.FromArgb(guid.GetHashCode());

不透明な色が必要な場合は、そのオーバーロードをColor.FromArgb使用してアルファを指定できます。同様のGUIDで非常に異なる色を生成する場合は、Guidで異なる種類のハッシュ(MD5ハッシュなど)を実行し、そこから色を生成するための番号を取得できます。

于 2012-08-11T03:21:23.687 に答える
3

このようなものはどうですか:

public Color ColorFromGuid(Guid guid)
{
    var values = guid.ToByteArray().Select(b => (int)b);
    int red = values.Take(5).Sum() % 255;
    int green = values.Skip(5).Take(5).Sum() % 255;
    int blue = values.Skip(10).Take(5).Sum() % 255;

    Color color = Color.FromArgb(red, green, blue);
    return color;
}

これは理想的ではないかもしれませんが、GUID ごとに色を取得し、同じ GUID は毎回同じ色になるはずです。

于 2012-08-11T03:15:32.460 に答える
1

関数でこれを行うと、がっかりするでしょう。

Guid は色の何倍もあるため、多くの Guid が同じ色にマッピングされます。何倍も多くの Guid が、近すぎて区別できない色にマップされます (例: #FFFF9999 と #FFFF9998)。実際には、ほんの一握りの色の違いしか区別できません。たとえば、絶対最大で 50 色です。

ガイドはランダムではありません。それを自分自身に繰り返してください。ガイドはランダムではありません。特に、データベースで生成された Guid を使用している場合は、Guid の前半が同じ「順次一意識別子」として知られている可能性があります。つまり、ガイドごとに異なるピンクの色合いになってしまうということですか? 多分。

そのため、Guid の分布を把握しており、その分布を適切な色分布にマップする関数を作成できない限り、関数によって生成された色に満足することはできません。

拡張可能な方法でこれを行う最も簡単な方法は、色 (名前、16 進コード、または RGB 値) と Guid の 2 つの列を含む単純なテーブルをデータベースに作成することです。その中で最も時間がかかるのは、色の選択です。これにより、特定のアイテムが別の色に似すぎている場合に、そのアイテムの色を変更できます。トリックはなく、単純なマッピングだけです。

于 2012-08-11T04:53:03.660 に答える