2016-09-21 61 views
4

我有一個項目,我必須寫一個高效的代碼,這將盡可能快地工作,但我缺乏這方面的知識......如何以更高效的方式編寫排序?

所以我有一個asp.net(MVC)項目使用實體框架,以及我必須使用Web服務來獲取有關它的細節的信息。 首先我向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

在我看來,您正在從Web服務獲取CSV文件。你知道這個文件是否每次都是一樣的嗎?如果是這樣,我會考慮用CSV解析器序列化返回。這會使我更容易管理對象,並且您可以選擇忽略默認情況下不需要的內容。 –

+0

爲什麼你在處理字符串?您可以將字符串解析爲對象並處理對象。 – BWA

+3

如果您繼續使用'String.Split',則更容易擺脫空字符串的方法是使用帶有'StringSplitOptions'參數的版本。你應該使用'StringSplitOptions.RemoveEmptyEntries'選項。 – hatchet

回答

3

您應該做的第一件事是使用此版本的Split以避免獲得空條目(https://msdn.microsoft.com/en-us/library/ms131448(v=vs.110).aspx)。

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

另外,如果你知道「數據」和「陣列」在字符串中,你永遠不希望他們,用空格代替它們,你分割字符串之前。

resultString = resultString.Replace("data", String.Empty) 
    .Replace("array", String.Empty); 

什麼我不明白是怎麼逗號既可以是一個字段分隔符和一個有意義的性格,你怎麼可能知道其中的差別(即25,50是否應該是一個單值或者兩個值)。

+0

至於''它如何既可以是字段分隔符也可以是有意義的字符'',我不確定,但可能是文化使用逗號而不是句號作爲小數點分隔符。 – Zack

+0

至於如何區分差異,也許每個實際的數字總是由一些其他文本分隔開來的,所以如果兩個數字在數組中相鄰,它們實際上是整數部分和相同數字的小數部分? – Zack

+0

是int和小數部分以''分開,這裏是示例attrValue:{\「data \」:{\「arrayA」:[{\「articleAttributes \」:{\「array \」:[{「attrId \「:\」attrIsConditional \「:false,\」attrName \「:\」Iekšējaisdiametrs [mm] \「,\」attrShortName \「:\」Iekšējaisdiametrs \「,\」attrUnit \ mm \「,\」attrValue \「:29,05,\」attrValueId \「:15235403} – GeekyNuns

相關問題