【问题标题】:Pattern based string parse基于模式的字符串解析
【发布时间】:2011-07-22 16:09:27
【问题描述】:

当我需要用逗号连接一些值时,我会这样做,例如:

string.Format("{0},{1},{3}", item.Id, item.Name, item.Count);

例如,"12,Apple,20"
然后我想做相反的操作,从给定的字符串中获取值。类似的东西:

parseFromString(str, out item.Id, out item.Name, out item.Count);

我知道,这在 C 中是可能的。但我不知道 C# 中的这种功能。

【问题讨论】:

  • 正如我在回答中所说的那样。当item.Name 包含',' 时会发生什么?
  • 使用 csvhelper 库 - 它会为你处理包含 ',' 字符的字符串

标签: c# .net string parsing


【解决方案1】:

是的,这很容易。您只需使用 String.Split method 在每个逗号上拆分字符串。

例如:

string myString = "12,Apple,20";
string[] subStrings = myString.Split(',');

foreach (string str in subStrings)
{
    Console.WriteLine(str);
}

【讨论】:

  • 那么,我应该这样做:item.Id = long.Parce(subStrings[0]); item.Name = subStrings[1]; item.Count = int.Parce(subStrings[2]);... 有没有“更快”的操作,比如 C 语言中的 scanf()
  • @DotNETNinja:是的,要将子字符串分配给数字类型,您需要使用Parse 方法。不,没有“更快”的操作。这种方法绝对没有“慢”的地方。如果这是您的应用程序的瓶颈,那么您就有一个严重 问题。在 99% 的情况下,您必须接受用户输入,而用户始终是所有应用程序中最慢的点。
  • @DotNETNinja,如果这太慢了,可能strings 是错误的类型。为什么不Marshal 你的结构?等等,不要回答那个...
  • @Jodrell:你会Marshal 它做什么?我假设您建议他编写一个本地调用 scanf 的 C++/CLI DLL,并在该 DLL 和他的 C# 应用程序之间来回编组数据?如果是这样,那就大错特错了……编组的开销将大大超过本机代码可能提供的任何性能优势。 (我什至不相信scanf 在面对面的基准测试中会更快。)更不用说scanf 的安全性和其他众所周知的问题了,你可以通过坚持使用纯托管代码来避免这些问题.
  • @Cody Gray,我的意思是“更快”=“更少代码”:) 所以,我明白了你的解释,非常感谢!
【解决方案2】:

可能的实现将使用String.SplitRegex.Match

例子。

public void parseFromString(string input, out int id, out string name, out int count)
{
    var split = input.Split(',');
    if(split.length == 3) // perhaps more validation here
    {
        id = int.Parse(split[0]);
        name = split[1];
        count = int.Parse(split[2]);     
    }
}

public void parseFromString(string input, out int id, out string name, out int count)
{
    var r = new Regex(@"(\d+),(\w+),(\d+)", RegexOptions.IgnoreCase);
    var match = r.Match(input);
    if(match.Success)
    {
        id = int.Parse(match.Groups[1].Value);
        name = match.Groups[2].Value;
        count = int.Parse(match.Groups[3].Value);     
    }
}

编辑:最后,SO 在 C# 中的 scanf 实现上有一堆线程
Looking for C# equivalent of scanf
how do I do sscanf in c#

【讨论】:

    【解决方案3】:

    如果你可以假设字符串格式,尤其是item.Name 不包含,

    void parseFromString(string str, out int id, out string name, out int count)
    {
        string[] parts = str.split(',');
        id = int.Parse(parts[0]);
        name = parts[1];
        count = int.Parse(parts[2]);
    }
    

    这只会做你想做的事,但我建议你添加一些错误检查。最好还是考虑序列化/反序列化为 XML 或 JSON。

    【讨论】:

    • 太棒了!我认为,我应该使用一些更复杂的 sing,而不是逗号来排除 Name 解析的错误。谢谢。
    【解决方案4】:

    使用拆分功能

    var result = "12,Apple,20".Split(',');
    

    【讨论】:

      猜你喜欢
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 2018-02-15
      • 2023-03-15
      相关资源
      最近更新 更多