我想拆分以下字符串来获取值,这是最有效和最有效的方法。
String Maturity = "0=Child|13=Teen|18=Adult";
我尝试了以下但不确定这是否是最佳方式。
string[] Configuration = Maturity.Split('|');
Int64 childAgeMin, teenAgeMin, adultAgeMin;
childAgeMin = Convert.ToInt64(Configuration[0].Substring(0, Configuration[0].IndexOf("=")));
teenAgeMin = Convert.ToInt64(Configuration[1].Substring(0, Configuration[1].IndexOf("=")));
adultAgeMin = Convert.ToInt64(Configuration[2].Substring(0, Configuration[2].IndexOf("=")));
我将在稍后用作
if (Age >= childMinAge && Age < teenMinAge)
Maturity = "Child";
else if (Age >= teenMinAge && Age < adultMinAge)
Maturity = "Teen";
else if (Age >= adultMinAge)
Maturity = "Adult";
提前感谢您的帮助
答案 0 :(得分:1)
创建如下所示的类:
public class PersonRecord
{
public int MinAge { get; set; }
public string Maturity { get; set; }
}
创建一个解析字符串的方法,如下所示:
public static List<PersonRecord> Parse(string records)
{
var splits = records.Split('|');
var persons = splits.Select(p =>
{
int age;
var split = p.Split('=');
if(int.TryParse(split[0], out age))
{
return new PersonRecord { MinAge = age, Maturity = split[1] };
}
// Age was not a number so so whatever you want here
// Or you can return a dummy person record
throw new InvalidOperationException("Records is not valid.");
}).ToList();
return persons;
}
像这样使用:
string records = "0=Child|13=Teen|18=Adult";
var persons = Parse(records);
var p1Maturity = persons[0].Maturity;
<强>性能强>
首先选择可用性和代码清晰度。如果还不是问题,请不要担心性能问题。进行性能测试,如果上面的代码是瓶颈,那么你可以优化它。
可能的改进
如果您需要/想要更多方法和属性,可以根据需要向PersonRecord
类MaxAge
添加其他属性。
答案 1 :(得分:1)
你所拥有的是足够有效的,真的。在这种情况下,几乎所有你能想到的东西都足够有效,但是为了整洁?好吧,我至少会重构转换为函数,你真的需要一个long int来存储年龄级别吗?我对此表示怀疑,因为人类通常不会 。我会选择常规的。
这样的事情:
int ConvertFromMaturityConfig(string maturityConfig)
{
string ageString = maturityConfig.Split('=')[0];
return int.Parse(ageString);
}
用法:
string maturity = "0=Child|13=Teen|18=Adult";
string[] configuration = maturity.Split('|');
int childAgeMin = ConvertFromMaturityConfig(configuration[0]);
int teenAgeMin = ConvertFromMaturityConfig(configuration[1]);
int adultAgeMin = ConvertFromMaturityConfig(configuration[2]);
我还会考虑尝试确定哪个配置属于哪个值。事实上,您希望按顺序获得孩子年龄,青少年年龄和成年年龄。就个人而言,有了你的限制,我会将它放入字典中,以便你可以在那里查找。那么你可以这样:
string maturity = "0=Child|13=Teen|18=Adult";
var config = maturity.Split('|')
.Select(s => s.Split('='))
.ToDictionary(
c => c[1], // key selector
c => int.Parse(c[0]));
然后你可以像这样使用它:
if (age >= config["Child"] && age < config["Teen"])
maturity = "Child";
else if (age >= config["Teen"] && age < config["Adult"])
maturity = "Teen";
else if (age >= config["Adult"])
maturity = "Adult";
顺便说一下,如果年龄低于最低儿童年龄,你会明智地考虑会发生什么。
答案 2 :(得分:0)
试试这个
string str = "0=Child|13=Teen|18=Adult";
List<string> seplist = str.Split('|').ToList();
int Age = 14;
string Maturity = string.Empty;
foreach (var item in seplist)
{
var part = item.Split('=');
if (int.Parse(part.First()) <= Age)
Maturity = part.Last();
else
{
if (int.Parse(part.First()) > Age)
break;
}
}
Console.WriteLine(Maturity);
Console.ReadLine();