1

ユニークな文字列のセットがあり、それらを色で表示したいと考えています。文字列はあちこちで繰り返されるため、ランダムではなく、一貫した色にする必要があります。

1つのアプローチは、色をランダム化して保存するDictionaryか、そのようなものに保存して、同じ色を再度使用できるようにすることです。

別のアプローチは、何らかの形で文字列を に変換する単純なアルゴリズム/ロジックを考え出すことSystem.Drawing.Colorです。

ただし、あまり良くない色になってしまわないように、定義済みの色のセットを維持したいと思います。これを と呼びましょうList<Color> allowedColors

Convert.ToByte()の R、G、B コンポーネントにバイトを使用することを試みましColorたが、変換がそのように機能しないため、うまくいきませんでした。

文字列は単純な文字列String foo = "bar";です。色と文字列の関係は、一貫している限り重要ではありません。つまり、プログラムが実行されるたびに同じ色に等しくなる必要があり、文字列ごとに色が異なる必要があります (はい、重複があります)。色よりも多くの文字列があり、1 対 1 のマッピングではないためです)。

それらの文字列は、私が管理していないソースから来ています。それらはユニークですが、異なります。プログラムが開始されるたびに、同じ文字列が表示された場合、同じ色になるはずです。

したがって、文字列からバイトへの変換を探していると思います。これは、オーバーラップするとバイト範囲が最初からやり直し、最後にバイトが RGB にマップされてに送信されColor.FromArgb()ます。

4

3 に答える 3

1

FramArgb メソッドを使用して、色のリストを作成できます。

var allowedColors = new List<Color>();
allowedColors.Add(Color.FromArgb(255, 0, 0));

または、辞書を使用して文字列から色へのマッピングを管理できます。

var colorMap = new Dictionary<string, Color>();
colorMap.Add("red", Color.FromArgb(255, 0, 0));

多くの場合、これは過剰に設計されたソリューションと見なされますが、いずれにせよ、C# でのカプセル化の例です。

class AppString
{
  private string text;
  private Color color;

  public AppString(string text, Color color)
  {
    this.text = text;
    if(allowedColors.Contains(color))
    {
      this.color = color;
    }
    else
    {
      throw new Exception("invalid color");
    }
  }

  // This lets you use an AppString most places where you used a regular string.
  public static implicit operator string(AppString appString) 
  { 
        return appString.text;
  }

  // This lets you use an AppString most places where you used a Color.
  public static implicit operator Color(AppString appString) 
  { 
        return appString.color;
  }

  // OR if you don't prefer overloading the implicit cast, a standard pattern
  // is to use a Value property.
  public string Value { get { return this.text; } }
  public Color Color { get { return this.color; } }
}
于 2012-05-06T20:28:32.983 に答える
1

最も簡単な方法は、各文字列にAvailableColorsリスト内の次に使用可能な色を割り当て、そのマッピングを最初に作成したときに辞書に保存することだと思います。これは、シリアル化を使用してディスクに保存し、後の実行で再利用できます。(更新された) サンプル コードを次に示します。

public Color[] AvailableColors = new Color[] { Colors.Red, Colors.Blue, Colors.Green};         
private int _nextColorIndex = 0;
public Dictionary<string,Color> ColorMappings = new Dictionary<string,Color>();
public Color GetNextColor () 
{
    Color nextColor = AvailableColors[_nextColorIndex];
    _nextColorIndex++;
    if (_nextColorIndex == AvailableColors.Length)
        _nextColorIndex = 0; // Restart colors and reuse.
    return nextColor;
}

public void AssignColor (string myString)
{
    ColorMappings.Add(myString, GetNextColor());
}

もちろん、文字列が不足した場合に備えて適切な処理を追加する必要があります。また、マルチスレッドで実行している場合は、GetNextColor の周りで同時実行ロックが発生する可能性がありますが、それは始まりです。

于 2012-05-06T20:11:58.607 に答える
1

既知の一意の文字列のセットと定義済みの色のセットがある場合は、辞書を使用してください。

Dictionary<string, Color> StringColors = new Dictionary<string, Color>()
{
    {"string1", Colors.Red},
    {"string2", Colors.Green},
    {"string3", Colors.Blue},
};

そして、それは次のように簡単です:

string theString = "string2";
var MyColor = StringColors[theString];
于 2012-05-06T20:01:54.917 に答える