我會採取另一種策略。首先,你的字符串分割子
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]);
最後,如果字符串總是有這種形式,你可以避免使用正則表達式。
'f'變量會發生什麼? – KyorCode
@KyorCode:沒什麼,只是跳過它。 – user1260827
「最佳方法」是什麼?可讀性?性能?最大限度地使用LINQ?最少量的代碼?還有別的嗎? – Oded