簡體   English   中英

如何從字符串中創建任意System.Drawing.Color?

[英]How to create an arbitrary System.Drawing.Color out of a string?

我有一組獨特的字符串,我希望用顏色顯示它們。 字符串在這里和那里重復,所以我需要着色是一致的,而不是隨機的。

一種方法是隨機化顏色並將其保存在Dictionary或類似的東西中,這樣我就可以再次使用相同的顏色。

另一種方法是提出一種簡單的算法/邏輯,以某種方式將字符串轉換為System.Drawing.Color

但是,我想將它保留為一組預定義的顏色,這樣我最終就不會有那么好的顏色了。 我們稱之為List<Color> allowedColors

我嘗試了Convert.ToByte()並認為我會使用該字節作為Color的R,G和B組件,但這不起作用,因為轉換不起作用。

字符串只是一個簡單的字符串String foo = "bar"; 顏色和字符串之間的關系無關緊要,只要它是一致的,即,每次運行程序時它應該等於相同的顏色,並且每個字符串的顏色通常應該是不同的(是的,會有重復顏色,因為有更多的字符串而不是顏色,它不是一對一的映射。

這些字符串來自我無法控制的來源。 它們是獨一無二的,但各不相同 每次啟動程序並且如果出現相同的字符串,它應該是相同的顏色。

所以,我想我正在尋找某種字符串到字節的轉換,當重疊字節范圍重新開始時,最后字節被映射到RGB並發送到Color.FromArgb()

如果您有一組已知的唯一字符串和一組預定義顏色,請使用字典:

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

然后就像這樣簡單:

string theString = "string2";
var MyColor = StringColors[theString];

我認為最簡單的方法是簡單地為每個字符串分配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周圍進行並發鎖定,但這是一個開始。

您可以使用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; } }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM