2016-09-21 10 views
4

できるだけ早く作業する効率的なコードを書く必要があるプロジェクトがありますが、知識が不足していますので...より効率的な方法で並べ替えを書くには?

私はasp.net(MVC)を持っています。エンティティフレームワークを使用してプロジェクトを作成し、同様にWebサービスを使用して詳細情報を取得する必要があります。 まず、Webサービスへのリクエストを行い、長い文字列で応答します。これは、後続の動作のために文字列のリストを解析する必要があります。

私はこのように、この文字列を解析:

list of strings

:私は情報とこのようになりジャンク行の多くを持つ行の多くのリストを、持ってここから

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

私はこのリストを迷惑情報から削除することにしました。さらなる方法でそれを扱い、ifsなどでこの行をチェックしないようにしました:

for (int i = words.Count - 1; i >= 0; i--) 
{ 
    if (words[i] == "" || words[i] == "data" || words[i] == "array") words.RemoveAt(i); 
} 

これ以降、明確なリストが得られましたが、価格、サイズなどの10進数は,で区切られていますので、私のリストに21,55の価格があれば、21と55の2つの要素のように見えます。区切り文字から,を削除するだけです。なぜなら、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に変換して、リスト内の次の要素が自分の番号であれば2番目の要素かどうかをチェックすることです。

コードを最適化するにはどうすればよいですか?

+1

ウェブサービスから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は、単一の値または2つの値でなければなりませんか)。

+0

フィールドの区切り文字と意味のある文字 ""の両方の意味は分かりませんが、区切りとしてピリオドの代わりにカンマを使用することができます。 – Zack

+0

違いを知る方法としては、実際の数字は他のテキストで*常に*区切られているかもしれないので、2つの数字が配列内で隣り合っていると、それらは実際には同じ数字の整数部分と小数部分です? – Zack

+0

はいintと小数部分は '、'で区切られています。例attrValue:{\ "data \":{\ "array \":[{\ "articleAttributes \":{\ "array \":[{"attrId \ "attrName \"、\ "attrName \":\ "attrIsConditional \":\ "attrName \":\ "attrShortName \": mm \ "、\" attrValue \ ":29,05、\" attrValueId \ ":15235403} – GeekyNuns

関連する問題