2009-09-08 1 views
0

요구 사항에 따라 역순으로 또는 컬렉션을 반환해야합니다.C# - 컬렉션 충분하거나 LINQ의 comobination 성능을 향상시킬 것입니다?

입니다. (샘플이 제공됩니다)

namespace Linqfying 

{ 

class linqy 

    { 
     static void Main() 

     { 

     InvestigationReport rpt=new InvestigationReport(); 

     // rpt.GetDocuments(true) refers 
     // to return the collection in reverse order  


      foreach( EnquiryDocument doc in rpt.GetDocuments(true) ) 
      { 

       // printing document title and author name  

      } 
     } 
    } 




class EnquiryDocument 

    { 
     string _docTitle; 

     string _docAuthor; 

     // properties to get and set doc title and author name goes below 


     public EnquiryDocument(string title,string author) 

     { 
     _docAuthor = author; 

     _docTitle = title; 
     } 

     public EnquiryDocument(){} 

} 



    class InvestigationReport 

    { 

     EnquiryDocument[] docs=new EnquiryDocument[3]; 

     public IEnumerable<EnquiryDocument> GetDocuments(bool IsReverseOrder) 

     { 

      /* some business logic to retrieve the document 

      docs[0]=new EnquiryDocument("FundAbuse","Margon"); 

      docs[1]=new EnquiryDocument("Sexual Harassment","Philliphe"); 

       docs[2]=new EnquiryDocument("Missing Resource","Goel"); 

     */ 


     //if reverse order is preferred 

      if(IsReverseOrder) 
      { 

       for (int i = docs.Length; i != 0; i--) 
       yield return docs[i-1]; 

      } 

     else 
      { 
      foreach (EnquiryDocument doc in docs) 
     { 
      yield return doc; 
      } 
     } 

     } 

} 

} 

질문 : 우리는 시작하는 수준의 프로그래머는 다음과 같은 컬렉션을 디자인

  • 우리가 효율성을 개선하기 위해 다른 컬렉션 타입을 사용할 수 있습니까?
  • LINQ와 Collection을 함께 사용하면 코드가 축소됩니까? (우리는 LINQ에 익숙하지 않습니다.)

답변

1

나에게 잘 어울립니다. 예, Reverse 확장 방법을 사용할 수는 있지만, 그 방법은 귀하가 가진 것만 큼 효율적이지는 않습니다.

효율성에 대해 얼마나 신경 쓰시겠습니까? 효율성이 문제라는 것을 알기 전까지는 가독 솔루션 (즉, Reverse)으로 갈 것입니다. 컬렉션이 큰 경우가 아니면 문제가되지는 않습니다.

"원시 데이터"가 배열 인 경우 반복기 블록을 사용하면 Reverse을 호출하는 것보다 효율적입니다. Reverse 메서드는 한 번에 하나의 항목을 생성하기 전에 모든 데이터를 버퍼링합니다. 실제로 코드 자체와 동일합니다. 그러나 Reverse을 호출하는 것이 훨씬 더 간단 할 것입니다.

다른 말고도 LINQ를 배우는 것이 좋습니다 - 적어도 LINQ to Objects. 그것은 가공 데이터 을 훨씬 많이 만들 수 있습니다. 이전보다 많이입니다.

+0

모두에게 감사 드리며 귀하의 조언을 따르 겠습니다. – user160677

+0

우리 프로젝트 책임자는 "방과후에도 그는 그런 나쁜 코딩 라인을 개발하지 않았습니다"라는 명령을 던졌습니다. 우리는 충격을 받았습니다. 이것이 우리가 게시 한 이유입니다. 모두 감사합니다. – user160677

1

두 질문 :

  1. 코드 현재 작업이 있습니까?
  2. 이 코드를 성능 병목 현상으로 파악 했습니까?

해당 질문 중 하나에 대한 대답이 '아니오'인 경우 걱정하지 마십시오. 그냥 작동시키고 계속 진행하십시오. 코드에 대해 큰 문제가 없으므로 걱정할 필요가 없습니다! 새로운 기능을 구축하는 데 시간을 할애하십시오. 아직 해결하지 않은 새로운 문제에 대해 LINQ를 저장하십시오.

+0

예. 잘 작동합니다. 렉스. 고맙습니다. – user160677

1

사실이 작업은 매우 간단합니다. 실제로는 Reverse method on a Generic List을 사용합니다.

이것은 이미 최적화가 잘되어 있습니다.

+0

대단히 감사합니다 steve – user160677

0

배열 한층 루프 IsReverseOrder이 거짓 인 경우 배열 형식이 IEnumerable을 그대로이기 때문에, 당신은 단지 그것을 반환 할 필요가 없습니다 ...에 관해서는

이없는 귀하의 GetDocuments 방법을 IEnumerable의 반환 유형이 IsReverseOrder가 true이면 Array.Reverse 또는 Linq Reverse() 확장 메서드를 사용하여 코드 양을 줄일 수 있습니다.

+0

고마워요 사이먼 :) – user160677

관련 문제