我有以下对象:
public class Color
{
public string RGB = "000225123";
}
我需要能够解析R,G和B组件,但它们可能不是那么精确,但是,我会知道顺序。一种方式,它可能是RGB
,但另一种方式可能是RBG
。
我想到了这样的事情:
string G = RGB.Substring(RGB.IndexOf('2'),3);
但在这里我碰巧知道G的开始和结束位置,所以我可以对其进行硬编码,这让我想到了另一个存储订单最佳方式的问题。我曾想过做类似的事情:
string order = "RGB";
string RGB = "000225123";
string R = RGB.Substring(order.IndexOf('R'),3);
上面的工作,但是每个部分可以是不同长度的情况怎么样,所以R
可以是2或3个字符,例如,这是我单独存储的东西,还是我将它存储在购买?
我可能有这样的数字:
28-34-29-000-00.0
或者它可以按顺序
29-34-28-000-00.0
在上面,28
和29
已切换,我将知道此顺序,我只需要知道如何解析它。
这是一个更现实的场景和解决方案,但我不确定它是否足够有效:
string order =“TSR”;
string value = "20-10-28-0000-0011";
string[] tokens = value .Split('-');
string t= tokens[order.IndexOf('T')];
string s= tokens[order.IndexOf('S')];
string r= tokens[order.IndexOf('R')];
答案 0 :(得分:2)
我会创建一个包含要解析的方法的接口。
例如,
IParseColorString
{
ColorParts Parse(String s);
}
ColorParts
{
public string R {get;}
public string G {get;}
public String B {get;}
// or if you wanted the int directly have int return type instead of string
}
然后让所有具有适当排序的类派生出接口:
ParseRGB : IParseColorString
{
public ColorParts Parse(String s)
{
// parsing logic for RGB
}
}
ParseRBG : IParseColorString
{
public ColorParts Parse(String s)
{
// parsing logic for RBG
}
}
然后随意使用它们。您甚至可以拥有一个将它们作为静态实例的工厂
ColorParsingFactory
{
public static IParseColorString ParseRGB {get{/* gets the RGB parser */}}
public static IParseColorString ParseRBG {get{/* gets the RBG parser */}}
}
答案 1 :(得分:1)
您可以使用这样的函数从字符串中提取组件:
public static int GetComponent(string data, string format, char component) {
return Int32.Parse(new String(data.Where((c, i) => format[i] == component).ToArray()));
}
用法:
string color = "000225123";
string format = "RRRGGGBBB";
int red = GetComponent(color, format, 'R');
int green = GetComponent(color, format, 'G');
int blue = GetComponent(color, format, 'B');
它适用于您可以用这种方式描述的任何格式:
string time = "2012-10-12 19:02";
string format = "YYYY MM DD hh mm";
int year = GetComponent(time, format, 'Y');
int month = GetComponent(time, format, 'M');
int day = GetComponent(time, format, 'D');
int hour = GetComponent(time, format, 'h');
int minute = GetComponent(time, format, 'm');
答案 2 :(得分:0)
将颜色转换为数字的更好方法是使用ARGB格式
Color c = Color.Aquamarine;
// Or if you have R-G-B values: Color c = Color.FromArgb(111,222,333);
int argb = c.ToArgb(); // --> -8388652
string s = argb.ToString(); // --> "-8388652"
// Backwards
argb = Int32.Parse(s);
c = Color.FromArgb(argb);
int R = c.R;
int G = c.G;
int B = c.B;
更新:
通过维护R-G-B部件将其存储为字符串的简单方法是
string s1 = "RGB;123;255;77";
string s2 = "RBG;123;77;255";
string[] parts = s1.Split(';');
int r, g, b;
switch (parts[0]) {
case "RGB":
r = Int32.Parse(parts[1]);
g = Int32.Parse(parts[2]);
b = Int32.Parse(parts[3]);
break;
case "RBG":
r = Int32.Parse(parts[1]);
b = Int32.Parse(parts[2]);
g = Int32.Parse(parts[3]);
break;
default:
r = 0;
b = 0;
g = 0;
break;
}
答案 3 :(得分:0)
由于您知道订单,因此可以使用string indexer。
获取值从MSDN公然被盗的例子:
string str1 = "Test";
for (int ctr = 0; ctr <= str1.Length - 1; ctr++ )
Console.Write("{0} ", str1[ctr]);
// The example displays the following output:
// T e s t
您可能还想查看System.Drawing.Color
。如果它真的是你解析的颜色,你甚至不需要定义自己的结构。
答案 4 :(得分:0)
如果我理解正确,还有一些其他服务可以为您提供订单和RGB字符串吗?
在这种情况下,让我们尝试忠实地存储类型并在抵达时转换数据。
public class Color{
public int R{
get;
set;
}
public int G{
get;
set;
}
public int B{
get;
set;
}
public Color(string mixedRGB, string order){
R = Int32.Parse(mixedRGB.Substring(order.IndexOf('R'),3));
G = Int32.Parse(mixedRGB.Substring(order.IndexOf('G'),3));
B= Int32.Parse(mixedRGB.Substring(order.IndexOf('B'),3));
}
如果您有内存限制,这将节省您的空间,并保护您的理智,防止分配给您的对象的无意义值。 (RGB字符串“DF)_3nAv1”的颜色是什么颜色?)
您将知道哪些值对应于R,G和B,因为您单独存储它们。如果你需要经常组合它们,你可以在这个类中创建一个函数来组合它们。