0

次のオブジェクトがあります。

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

上記では、2829が入れ替わっていて、この順序がわかります。それを解析する方法を知る必要があるだけです。

より現実的なシナリオと解決策を次に示しますが、十分に効率的かどうかはわかりません。

文字列の順序 = "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')];
4

5 に答える 5

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 */}}
}
于 2012-10-12T16:56:21.193 に答える
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');
于 2012-10-12T16:59:08.227 に答える
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;

アップデート:

RGB部分を維持して文字列として保存する簡単な方法は次のとおりです。

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;
}
于 2012-10-12T16:59:47.070 に答える
0

順序がわかっているので、文字列 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。解析しているのが本当に色である場合は、独自の構造を定義する必要さえありません。

于 2012-10-12T17:04:23.513 に答える
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 に対応する値は、それらを別々に保存するため、わかります。それらを頻繁に組み合わせる必要がある場合は、このクラスで関数を作成してそれらを組み合わせることができます。

于 2012-10-12T17:10:40.643 に答える