私は別の戦略を採用します。まず、文字列のサブコンポーネントを分割します
var components = formatSeats.Split(',');
これにより、文字列の配列が得られます。これは、大きな文字列の代わりに文字列の小さなチャンクを解析するのにはるかに効率的です。
次に、を使用Regex
して値を抽出するか、次のような単純なコードを使用できます。
foreach(var component in components)
{
var parts = component.Trim("[]".ToCharArray()).Split(';');
}
var results = from component in components
let c = component.Trim("[]".ToCharArray())
.Split(';')
.Select(c=>int.Parse(c.SubString(2))
select new { l = c[0], f=c[1], r=c[2], p = c[3] };
これにより、匿名タイプの列挙が生成されます。
foreach(var x in results)
{
Console.WriteLine("{0} / {1} / {2} / {3}", x.l, x.f, x.r, x.p);
}
実際に必要な場合はTuple
、コードを次のように変更するだけです。
var results = from component in components
let c = component.Trim("[]".ToCharArray())
.Split(';')
.Select(c=>int.Parse(c.SubString(2))
select new Tuple<int,int,int,int>{ l = c[0], f=c[1], r=c[2], p = c[3] };
ただし、コードを単純化し、読みやすさを向上させるために、小さな構造体を作成することをお勧めします。
public struct MyValue
{
private readonly int m_L;
public int L { get {return m_L; } }
private readonly int m_F;
public int F { get {return m_F; } }
private readonly int m_R;
public int R { get {return m_R; } }
private readonly int m_P;
public int P { get {return m_P; } }
public MyValue(int l, int f, int r, int p)
{
m_L = l;
m_F = f;
m_R = r;
m_P = p;
}
}
....
var results = from component in components
let c = component.Trim("[]".ToCharArray())
.Split(';')
.Select(c=>int.Parse(c.SubString(2))
select new MyValue(c[0],c[1],c[2],c[3]);
最後に、文字列が常にこの形式である場合は、正規表現の使用を避けることができます。