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,你要求的是“最快”的解决方案,所以你不想浪费时间解析多种格式,只需要最少的代码就可以解析当前格式。我更新了我的帖子,如果我有