c# - 从字符串解析动态 int 列表的最有效方法

标签 c# list

出于好奇,是否有更快/更有效的方法从 string 解析 int 的动态列表?

目前我有这个,它工作得很好;我只是在想可能有更好的方法,因为对于如此简单的事情来说,这似乎有点过于复杂。

public static void Send(string providerIDList)
{
String[] providerIDArray = providerIDList.Split('|');
var providerIDs = new List<int>();
for (int counter = 0; counter < providerIDArray.Count(); counter++)
{
     providerIDs.Add(int.Parse(providerIDArray[counter].ToString()));
}
//do some stuff with the parsed list of int

编辑:也许我应该说一种更简单的方法来从字符串中解析出我的列表。但由于最初的问题确实说明了更快、更高效,所以选择的答案将反射(reflect)这一点。

最佳答案

绝对有更好的方法。使用 LINQ:

var providerIDs = providerIDList.Split('|')
                                .Select(x => int.Parse(x))
                                .ToList();

或者使用方法组转换而不是 lambda 表达式:

var providerIDs = providerIDList.Split('|')
                                .Select(int.Parse)
                                .ToList();

不是最有效的方法,但很可能是最简单的方法。它与您的方法一样高效 - 尽管可以很容易地提高效率,例如给予List初始容量。

性能上的差异可能无关紧要,所以我会坚持使用这个简单的代码,直到您有证据表明它是一个瓶颈。

请注意,如果您不需要 List<int> - 如果你只需要一些你可以迭代一次的东西 - 你可以杀死 ToList调用并使用providerIDs作为IEnumerable<int> .

编辑:如果我们从事效率业务,那么这是对 ForEachChar 的改编。方法,避免使用 int.Parse :

public static List<int> ForEachCharManualParse(string s, char delim)
{
    List<int> result = new List<int>();
    int tmp = 0;
    foreach(char x in s)
    {
        if(x == delim)
        {
            result.Add(tmp);
            tmp = 0;
        } 
        else if (x >= '0' && x <= '9')
        {
            tmp = tmp * 10 + x - '0';
        }
        else
        {
            throw new ArgumentException("Invalid input: " + s);
        }
    }
    result.Add(tmp);
    return result;
}

注意事项:

  • 这将为任何连续的分隔符添加零,或者在开始或结束处添加一个分隔符
  • 它不处理负数
  • 它不检查溢出
  • 如评论中所述,使用 switch声明而不是 x >= '0' && x <= '9'可以进一步提高性能(大约 10-15%)

如果这些对您来说都不是问题,它比 ForEachChar 快大约 7 倍在我的机器上:

ListSize 1000 : StringLen 10434
ForEachChar1000 Time : 00:00:02.1536651
ForEachCharManualParse1000 Time : 00:00:00.2760543

ListSize 100000 : StringLen 1048421
ForEachChar100000 Time : 00:00:02.2169482
ForEachCharManualParse100000 Time : 00:00:00.3087568

ListSize 10000000 : StringLen 104829611
ForEachChar10000000 Time : 00:00:22.0803706
ForEachCharManualParse10000000 Time : 00:00:03.1206769

这些限制是可以解决的,但我没有费心...如果它们对您来说很重要,请告诉我。

关于c# - 从字符串解析动态 int 列表的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17931691/

相关文章:

c# - 如何以编程方式更改 Windows 10 任务栏图标大小

c# - 如何格式化 DateTime 以在 Razor 生成的 View 中仅显示为一天中的时间?

java - 如何使列表变量的泛型可序列化

Python:Hangman TypeError: 'str'对象不支持项目分配

c# - IEnumerable<string> System.ObjectDisposedException

c# - 从 int 创建一个 Guid

r - 以特定方式组合列表中的数据帧列表

c++ - 在初始化列表c++中初始化类数组

python - 在python中混合两个不对称列表

c# - 如何使用 Java 使用 SOAP Web 服务?