出于好奇,是否有更快/更有效的方法从 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/