[英]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.