在某些电子邮件应用程序中,列表项显示为“卡片”,每个列表项都有一个带有标题文本第一个字母的大圆形图标。转换是稳定的 - 每次都将每个字母转换为相同的颜色(颜色和字母的数量可能不匹配)。我认为,它可能会大大改善视觉和导航。
我可以将每个字母的颜色值硬编码为某种字典。但我想根据字母代码获得颜色(类似于Google的颜色)以避免硬编码。
所以,问题是 - 用什么算法从字母中获取类似Gmail的颜色。
任何编程语言都可以用于解决方案,但更适合使用C#。
如果算法将覆盖任何字符,不仅是拉丁字母符号,而且可能是西里尔字母和一些特殊字符(如@,#,$,%等),这将是很好的。
从我自己的帐户中附加样本。
答案 0 :(得分:1)
这是一个非常简单的算法,请注意您应该根据您希望的功能进行调整:
首先,我将获取一个字符,从中获取ASCII码。 然后我会通过之前添加零来确保它的3个数字。 然后将该值及其前后的值用作RGB颜色。
以下是代码:
Console.Write("Please enter a given character: ");
var characterCode = Convert.ToInt32(Console.ReadKey().KeyChar).ToString();
Console.WriteLine("");
// Convert integer 182 as a hex in a string variable
string characterRColor = characterCode.PadLeft(3, '0');
string characterGColor = (Convert.ToInt32(characterCode) - 1).ToString().PadLeft(3, '0');
string characterBColor = (Convert.ToInt32(characterCode) + 1).ToString().PadLeft(3, '0');
Console.WriteLine("R Color: " + characterRColor);
Console.WriteLine("G Color: " + characterGColor);
Console.WriteLine("B Color: " + characterBColor);
Console.ReadLine();
答案 1 :(得分:1)
public static Color ToColorFromTitleCaseLetters(this string fullName)
{
if (fullName.IsNullOrEmpty()) return Color.Blue;
try
{
string result = string.Concat(Regex
.Matches(fullName, "[A-Z]")
.OfType<Match>()
.Select(match => match.Value));
int hash = 1;
if (result.Length > 1)
{
hash = (Convert.ToInt32(result[0]) - 64) * 100 + Convert.ToInt32(result[1]) - 64;
//https://stackoverflow.com/questions/14204827/ms-chart-for-net-predefined-palettes-color-list
string[] colors = new[]
{
"008000", "0000FF", "800080", "800080", "FF00FF", "008080", "FFFF00", "808080", "00FFFF",
"000080",
"800000", "FF3939", "7F7F00", "C0C0C0", "FF6347", "FFE4B5", "33023", "B8860B", "C04000",
"6B8E23", "CD853F", "C0C000", "228B22", "D2691E", "808000", "20B2AA", "F4A460", "00C000",
"8FBC8B", "B22222", "843A05", "C00000"
};
int max = (('Z' - 64) * 100 + 'Z' - 64);
decimal index = ((decimal) hash / (decimal) max) * colors.Length;
return Color.FromHex(colors[(int) index]);
}
}
catch
{
}
return Color.Blue;
}