2016-09-21 3 views
4

가능한 한 빨리 작업 할 효율적인 코드를 작성해야하는 프로젝트가 있지만 지식 부족으로 인해 ...보다 효율적인 방법으로 정렬을 작성하는 방법은 무엇입니까?

그래서 asp.net (MVC) 프로젝트를 엔티티 프레임 워크를 사용하고 또한 웹 서비스를 사용하여 세부 정보에 대한 정보를 얻어야합니다. 먼저 웹 서비스에 요청하고 긴 문자열로 응답합니다. 추가 작업을 위해 문자열 목록에서 구문을 분석해야합니다.

나는 다음과 같은 문자열을 구문 분석 :

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 달러라면 내 요소 21과 55처럼 보입니다. 분리 자로부터 ,을 그냥 삭제하십시오. 웹 서비스에서 응답을 얻으려는 문자열은 주로 ,을 넣어서 정보를 분리하기 때문입니다.

그래서 다시 진수 접착제 결정 (전리스트 요소 모습이 블록 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

웹 서비스에서 CSV 파일을 가져 오는 것 같습니다. 파일이 매번 같을 지 알고 있습니까? 그렇다면 CSV 파서로 반환을 직렬화하는 방법에 대해 생각해 보겠습니다. 내 의견으로는 객체로 관리하기가 더 쉬울 것이며, 기본적으로 필요없는 것을 무시하도록 선택할 수 있습니다. –

+0

왜 문자열 작업을하나요?문자열을 객체로 구문 분석하고 객체에서 작업 할 수 있습니다. – BWA

+3

'String.Split'을 계속 사용한다면 빈 문자열을 없애는 더 쉬운 방법은'StringSplitOptions' 매개 변수를 취하는 버전을 사용하는 것입니다. 'StringSplitOptions.RemoveEmptyEntries' 옵션을 사용해야합니다. – hatchet

답변

3

먼저 빈 항목 (https://msdn.microsoft.com/en-us/library/ms131448(v=vs.110).aspx)이 발생하지 않도록이 버전을 Split으로 사용하십시오. 당신이 "데이터"와 "배열"문자열에 있는지 알고 당신이 그들을 싶지 않은 경우 문자열을 분할하기 전에 또한

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 \": {\ "array \": [{\ "articleAttributes \": {\ "array \": [{ "attrId \ "attrName \": \ "attrName \": \ "attrName \": \ "attrShortName \": \ "attrName \": \ "attrIsConditional \": \ "attrName \ mm \ ", \"attrValue \ ": 29,05, \"attrValueId \ ": 15235403} – GeekyNuns

관련 문제