分割字符串的有效方法

时间:2017-03-11 11:44:13

标签: c# split

我想拆分以下字符串来获取值,这是最有效和最有效的方法。

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";

提前感谢您的帮助

3 个答案:

答案 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;

<强>性能

首先选择可用性和代码清晰度。如果还不是问题,请不要担心性能问题。进行性能测试,如果上面的代码是瓶颈,那么你可以优化它。

可能的改进

如果您需要/想要更多方法和属性,可以根据需要向PersonRecordMaxAge添加其他属性。

答案 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();