我有一个项目,需要编写尽可能快速工作的高效代码,但由于知识不足而无法完成...
因此,我有一个使用实体框架的asp.net(MVC)项目,并且还必须使用Web服务来获取关于它的详细信息。 首先,我向Web服务发出请求,它会响应一个长字符串,我必须将其解析为字符串列表以进行后续活动。
我像这样解析这个字符串:
string resultString;
char[] delimiterChars = { ',', ':', '"', '}', '{' };
List<string> words = resultString.Split(delimiterChars).ToList();
我有一个包含很多行信息的列表,其中有许多无用的行看起来像这样:
我决定清除这个列表中的垃圾信息,以便在后续方法中不必再处理它,也不必使用if等方法检查这些行:
for (int i = words.Count - 1; i >= 0; i--)
{
if (words[i] == "" || words[i] == "data" || words[i] == "array") words.RemoveAt(i);
}
在这之后,我得到了一个清晰的列表,但是每个十进制数(如价格、尺寸等)都被
,
分隔开了,所以如果我的列表中有价格21.55,现在看起来像是2个元素21和55。我不能只删除分隔符中的,
,因为我从web服务响应中获得的字符串主要是通过放置,
来分隔信息的。因此,我决定将小数点数字粘回去(在此块列表元素看起来像:1)attrValue 2)21 3)55,而之后则是:1)attrValue 2)21.55)。
for (int i = 0; i < words.Count(); i++)
{
if (words[i] == "attrValue")
{
try
{
var seconPartInt = Int32.Parse(words[i + 2]);
words[i + 1] += "." + words[i + 2];
}
catch { }
}
if (words[i].Contains("\\/")) words[i].Replace("\\/", "/");
}
一切都没问题,列表已排序,小数也被收集了起来,但速度却减缓了30%。通过使用秒表进行测试和注释代码块,很明显以上代码会导致整个程序变得太慢...
总之: 我不能使用那么慢的代码,同时也不知道如何使它更快。也许问题在于我将字符串转换为整数以检查列表中的下一个元素是否是我的数字的第二部分。
我该如何优化我的代码?
String.Split
,那么更简单的方法是使用带有StringSplitOptions
参数的版本来去除空字符串。您应该使用StringSplitOptions.RemoveEmptyEntries
选项。 - hatchet - done with SOverflowInt32.TryParse()
替代Int32.Parse()
。抛出异常非常昂贵,因为您的代码预计会有很多解析失败,如果切换到TryParse
,您将获得大量的性能提升。 - Brandon