我有一个字符串变量,其中包含 [l=9;f=0;r=5;p=2]
。可能有不止一个:[l=9;f=0;r=5;p=2],[l=9;f=0;r=6;p=2]
.
我想要List
的Tuple<int,int,int>
,其中item1 = value of l, item2= value of r, item3=value of p
。做到这一点的最佳方法是什么?
我的代码:
// split string
var splittedFormatedSeats = Regex.Matches(formatSeats, @"\[.+?\]")
.Cast<Match>()
.Select(m => m.Value)
.ToList();
IList<Tuple<int,int,int>> fullSeat = new List<Tuple<int, int, int>>();
foreach (var splittedFormatedSeat in splittedFormatedSeats)
{
...
}
谢谢。
最佳答案
我会采取另一种策略。首先,拆分字符串的子组件
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]);
最后,如果字符串始终具有这种形式,您可以避免使用正则表达式。
关于c# - 字符串中的子字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12296854/