如何更高效地编写排序算法?

4

我有一个项目,需要编写尽可能快速工作的高效代码,但由于知识不足而无法完成...

因此,我有一个使用实体框架的asp.net(MVC)项目,并且还必须使用Web服务来获取关于它的详细信息。 首先,我向Web服务发出请求,它会响应一个长字符串,我必须将其解析为字符串列表以进行后续活动。

我像这样解析这个字符串:

string resultString;
char[] delimiterChars = { ',', ':', '"', '}', '{' };
List<string> words = resultString.Split(delimiterChars).ToList();

我有一个包含很多行信息的列表,其中有许多无用的行看起来像这样:

list of strings

我决定清除这个列表中的垃圾信息,以便在后续方法中不必再处理它,也不必使用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%。通过使用秒表进行测试和注释代码块,很明显以上代码会导致整个程序变得太慢...

总之: 我不能使用那么慢的代码,同时也不知道如何使它更快。也许问题在于我将字符串转换为整数以检查列表中的下一个元素是否是我的数字的第二部分。

我该如何优化我的代码?


1
看起来你从 Web 服务获取了一个 CSV 文件。你知道这个文件每次都会是一样的吗?如果是的话,我建议使用 CSV 解析器对返回结果进行序列化处理。在我看来,这样可以更方便地将其作为对象进行管理,并且你可以选择默认忽略不需要的内容。 - Kevin B Burns
为什么要处理字符串?你可以将字符串解析成对象,然后对对象进行操作。 - BWA
3
如果您继续使用String.Split,那么更简单的方法是使用带有StringSplitOptions参数的版本来去除空字符串。您应该使用StringSplitOptions.RemoveEmptyEntries选项。 - hatchet - done with SOverflow
1
使用 Int32.TryParse() 替代 Int32.Parse()。抛出异常非常昂贵,因为您的代码预计会有很多解析失败,如果切换到 TryParse,您将获得大量的性能提升。 - Brandon
1个回答

3

首先要做的是使用这个版本的 Split,以避免出现空条目 (https://msdn.microsoft.com/en-us/library/ms131448(v=vs.110).aspx)。

List<string> words = resultString.Split(delimiterChars, StringSplitOptions.RemoveEmptyEntries)
    .ToList();

此外,如果您知道字符串中包含"data"和"array",并且您不需要它们,请在拆分字符串之前用空白替换它们。
resultString = resultString.Replace("data", String.Empty)
    .Replace("array", String.Empty);

我不理解的是逗号如何既可以作为字段分隔符,又可以作为一个有意义的字符,而你又如何知道区别(即25,50应该是一个值还是两个值)。

至于“它如何既是字段分隔符又是有意义的字符”,我不确定,但可能是该文化使用逗号而不是点作为其十进制分隔符。 - Zack
至于如何区分,也许每个实际数字总是被一些其他文本隔开,因此如果数组中有两个数字相邻,则它们实际上是同一个数字的整数部分和小数部分? - Zack
是的,整数部分和小数部分在这里用逗号“,”分隔。以下是示例attrValue: {"data":{"array":[{"articleAttributes":{"array":[{"attrId":496,"attrIsConditional":false,"attrName":"Iekšējais diametrs [mm]","attrShortName":"Iekšējais diametrs","attrUnit":"mm","attrValue":29,05,"attrValueId":15235403} - GeekyNuns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接