当前位置: 首页 > 知识库问答 >
问题:

用C中的分隔符获取字符串(int)一部分的最快方法#

程天佑
2023-03-14

我有一个字符串,如下所示:

<1>something here just not relevant</1>

我需要最快的方法才能拿到1号。

我的尝试:

int signature=Convert.ToInt32(data.Split('


共有2个答案

郁宾鸿
2023-03-14
string str = "<1>something here just not relevant</1>";
result = int.Parse(str.Substring(1, str.IndexOf('>') - 1));

这应该比正则表达式快,并且只要您能确定字符串的第一个字符是开始的尖括号(而不是空格或前一个标记)就可以工作。如果您不能确定这一点,请使用第二个IndexOf

string str = "<1>something here just not relevant</1>";
var start = str.IndexOf('<')+1;
result = int.Parse(str.Substring(start, str.IndexOf('>') - start));

正则表达式匹配会更可靠、更干净,但速度稍慢:

string str = "<1>something here just not relevant</1>";
result = int.Parse(Regex.Match(str, "<(\d+)>").Captures[0]);
阎智
2023-03-14

只是为了好玩和出奇的快:

public static int GetSignature(string value)
{
  int result = 0;
  for (int i = 1; i < 12; i++) // 12 should be more than enough for Int32
  {
    if (value[i] == '>')
    {
      break;
    }
    result = (result * 10) + (value[i] - '0');
  }
  return result;
}

编辑:我的快速测试设置

class Program
{
  static void Main(string[] args)
  {
    Run(new Random());

    Console.ReadLine();
  }

  private static void Run(Random rnd)
  {
    var counts = new[] { 10, 100000, 10000000 };

    foreach (var count in counts)
    {
      Console.WriteLine(count);
      Run(count, rnd);
      Console.WriteLine();
    }
  }

  private static void Run(int count, Random rnd)
  {
    var values = GetValues(count, rnd);

    var funcs
      = new Dictionary<string, Func<string, int>>
      {
        {"OP", GetSignatureOP},
        {"Keith", GetSignatureKeith},
        {"Fun", GetSignatureFun},
      };

    foreach (var kvp in funcs)
    {
      TimeSpan elapsed;
      Test(values, kvp.Value, out elapsed);
      Console.WriteLine("{0,-5}: {1:G}", kvp.Key, elapsed);
    }
  }

  private static IList<string> GetValues(int count, Random rnd)
  {
    var result = new List<string>(count);

    for (int index = 0; index < count; index++)
    {
      result.Add(string.Format("<{0}>something here just not relevant</{0}>", rnd.Next(1, 10)));
    }

    return result;
  }

  private static int Test(IEnumerable<string> values, Func<string, int> func, out TimeSpan elapsed)
  {
    GC.Collect();
    GC.WaitForPendingFinalizers();

    var sw = Stopwatch.StartNew();
    var count = values.Aggregate(0, (current, value) => current ^ func(value));
    sw.Stop();

    elapsed = sw.Elapsed;

    return count;
  }


  private static int GetSignatureOP(string value)
  {
    return Convert.ToInt32(value.Split('>')[0].Remove(0, 1));
  }
  private static int GetSignatureKeith(string value)
  {
    return int.Parse(value.Substring(1, value.IndexOf('>') - 1));
  }
  private static int GetSignatureFun(string value)
  {
    int result = 0;
    for (int i = 1; i < 12; i++)
    {
      if (value[i] == '>')
      {
        break;
      }
      result = (result * 10) + (value[i] - '0');
    }
    return result;
  }
}

结果(在我的机器上):

10
OP   : 0:00:00:00,0007532
Keith: 0:00:00:00,0001523
Fun  : 0:00:00:00,0001307

100000
OP   : 0:00:00:00,0306495
Keith: 0:00:00:00,0116116
Fun  : 0:00:00:00,0018416

10000000
OP   : 0:00:00:02,7450986
Keith: 0:00:00:01,1598363
Fun  : 0:00:00:00,1855654

并带有 rnd 的随机值。下一页(1, int.最大值)

10
OP   : 0:00:00:00,0006975
Keith: 0:00:00:00,0001147
Fun  : 0:00:00:00,0001246

100000
OP   : 0:00:00:00,0409755
Keith: 0:00:00:00,0187789
Fun  : 0:00:00:00,0030894

10000000
OP   : 0:00:00:04,0060685
Keith: 0:00:00:01,9214684
Fun  : 0:00:00:00,3083399
 类似资料:
  • 问题内容: 我有一个像这样的字符串: 我想拆分该字符串并选择作为分隔符。 我的代码如下所示: 我得到的是一个包含所有字符作为一个条目的数组: 有人知道为什么吗? 我不能用分割字符串吗? 问题答案: 在RegEx中被视为。因此,您需要对其进行转义:

  • 问题内容: 如何在定界符哪里分割此字符串 获得?的输出 问题答案: 你可以使用以下功能:

  • 问题内容: 我有一个字符串,例如“ 600sp”,我希望从中获得整数部分(600)。 如果我这样做,由于字符串中遇到非数字值“ s”,我将收到异常。 抓住整数部分的最快最干净方法是什么? 谢谢! 问题答案: 如果您的字符串格式始终是数字后跟一些字符,请尝试执行此操作

  • 在字符串中分隔符的最后一次出现时拆分字符串的推荐Python习惯用法是什么?例如: 接受第二个参数,该参数是要拆分的分隔符的引用。与常规列表索引一样,表示从末尾开始的最后一个。如何做到这一点?

  • 问题内容: 对于在字符串中 最后一次 出现定界符时拆分字符串的建议Python惯用法是什么?例: 接受第二个参数,即要分割的分隔符的出现。像常规列表索引一样,表示末尾的末尾。如何才能做到这一点? 问题答案: 使用 或代替: 可让您指定分割次数,而仅分割一次,但总是返回固定数量的元素(前缀,定界符和后缀),并且对于单个分割情况而言更快。 演示: 两种方法都从字符串的右侧开始拆分;通过将最大值作为第二

  • 问题内容: 我有以下字符串; 等级,用户名和消息的字符每次都不同。将其分为三个独立变量(用户名,等级和消息)的最佳方法是什么? 我已经尝试过: 但这会抛出错误。提前致谢! 问题答案: 使用Java对正则表达式()的支持,并让正则表达式匹配这三个部分。 例如这个: Java代码段,略微改编自Ian F. Darwin的“ Java Cookbook”(O’Reilly): 输出: