如何以更有效的方式编写排序?

时间:2016-09-21 14:27:56

标签: c# asp.net asp.net-mvc

我有一个项目,我必须编写一个尽可能快的高效代码,但我缺乏知识,所以...

所以我有一个使用实体框架的asp.net(MVC)项目,我也必须使用Web Service从中获取有关细节的信息。 首先,我向Web服务发出请求,并使用长字符串进行响应,我必须在字符串列表中进行解析以进行进一步的活动。

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

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

从这里我有很多行的列表,其中包含信息和大量垃圾行,如下所示:

list of strings

我决定从垃圾信息中清除这个列表,以免在其他方法中使用它而不用ifs检查这些行等等:

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%。经过秒表和评论代码块的一些测试后,很明显上面的代码太慢了整个程序......

总结: 我不能使用那个慢代码,同时又不知道如何让它更快地工作。可能是问题是我将字符串转换为int,以便检查列表中的下一个元素是否是我的号码的第二部分。

我如何优化代码?

1 个答案:

答案 0 :(得分: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应该是单个值还是两个值)。