C# 提取字符串某些部分最有效的方法是什么?
我的目标如下:C# 提取字符串某些部分最有效的方法是什么?,c#,C#,我的目标如下: public class Color { public string RGB = "000225123"; } 我需要能够解析出R、G和B组件,但它们可能不是那么精确,但是,我会知道顺序。因此,一种方式可能是RGB,但另一种方式可能是RBG 我想到了这样的事情: string G = RGB.Substring(RGB.IndexOf('2'),3); 但在这里,我碰巧知道G的开始和结束,所以我可以硬编码它,这就引出了另一个问题,即存储订单的最佳方式是什么。我曾想过
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个字符,例如,这是我单独存储的还是我在订单中存储的
我可能有这样一个数字:
string G = RGB.Substring(RGB.IndexOf('2'),3);
28-34-29-000-00.0
或者它可能是按顺序排列的
29-34-28-000-00.0
在上面的28
和29
被切换,我将知道这个顺序,我只需要知道如何解析它
下面是一个更现实的场景和解决方案,但我不确定它是否足够有效:
字符串顺序=“TSR”
我将创建一个包含要解析的方法的接口 例如 然后让所有具有适当顺序的类派生接口:
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 */}}
}
我将创建一个包含要解析的方法的接口 例如 然后让所有具有适当顺序的类派生接口:
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 */}}
}
您可以使用如下函数从字符串中提取组件:
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');
您可以使用如下函数从字符串中提取组件:
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');
将颜色转换为数字的更好方法是使用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-parts将其存储为字符串的简单方法如下
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;
}
将颜色转换为数字的更好方法是使用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-parts将其存储为字符串的简单方法如下
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;
}
因为您知道顺序,所以可以使用 明目张胆地从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
string str1=“测试”;
对于(int-ctr=0;ctr,因为您知道顺序,所以可以使用
明目张胆地从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
string str1=“测试”;
对于(int-ctr=0;ctr如果我理解正确的话,还有其他服务可以为您提供订单和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”\u 3nAv1是什么颜色?)
您将知道哪些值对应于R、G和B,因为它们是分开存储的。如果您需要经常组合它们,您可以在此类中创建一个函数来组合它们。如果我理解正确,还有一些其他服务可以为您提供订单和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”\u 3nAv1是什么颜色?)
您将知道哪些值对应于R、G和B,因为您分别存储它们。如果您需要频繁地组合它们,您可以在此类中创建一个函数来组合它们。为什么要使用字符串而不是结构?“对于每个部分都可以是不同长度的场景如何?”-这是一个愚蠢的想法,一开始就不要这样做。@millimoose-没有理由,我只是碰巧将其放在这个示例中。在这种情况下,结构会给我带来什么好处?会有多少变化?是否有两种或三种可能的格式,或者您是否需要描述任何可能的格式,如RRRGGBBB、BBGGGGRRR、GGRBBB、BRRRG、RGGGGGBBB、RRGB、GGGBBBBR、BGR、BBBGR、RBBBGGG、RGGGGB等?您不可能单独存储R、G和B(类、结构或三个变量)?这样,您的代码就更加清晰,子字符串问题也就消失了。为什么要使用字符串而不是结构呢?“如果每个部分都可以有不同的长度,情况会怎样?”-这是一个愚蠢的想法,一开始就不要这样做。@millimoose-没有理由,我只是碰巧在这个示例中提到了这一点。在这种情况下,结构会给我带来什么好处?会有多少变化?是否有两种或三种可能的格式,或者您是否需要描述任何可能的格式,如RRRGGBBB、BBGGGGRRR、GGRBBB、BRRRG、RGGGGGBBB、RRGB、GGGBBBBR、BGR、BBBGR、RBBBGGG、RGGGGB等?您不可能单独存储R、G和B(类、结构或三个变量)?这样你的代码就更清晰了,你的子字符串问题也就消失了。这是不是太多的开销?我不相信这是太多的代码。它非常干净,并提供了一个单独的位置,用于根据一种特定格式将字符串转换为所需的内容。如果您有很多正在解析的格式,那么您可能可以创建一个更通用的解析器,该解析器可能采用一个表达式,这样您就可以任意生成所需的任何解析器逻辑,并且仍然可以传递解析器。+1@Xaisoft,你要求的是“最快”的解决方案,所以你不想浪费时间解析多种格式,只需要最少的代码就可以解析当前格式。我更新了我的帖子,如果我有