2009-09-08 6 views
0

Selon l'exigence, nous devons retourner une collection soit dans l'ordre inverse ouC# - Collection est suffisante ou la comobinaison de LINQ permettra d'améliorer les performances?

il est. Nous, programmeur de niveau débutant conçu la collection comme suit: (échantillon donné)

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; 
      } 
     } 

     } 

} 

} 

Question:

  • Peut-on utiliser un autre type de collecte pour améliorer l'efficacité?
  • Le mélange de Collection avec LINQ réduit le code? (Nous ne sommes pas familiers avec LINQ)

Répondre

1

Cela me semble bien. Oui, vous pouvez utiliser la méthode d'extension Reverse ... mais ce ne sera pas aussi efficace que ce que vous avez.

À quel point vous souciez-vous de l'efficacité? Je voudrais aller avec la solution la plus lisible (à savoir Reverse) jusqu'à ce que vous sachiez que l'efficacité est un problème. À moins que la collection soit grande, il est peu probable que ce soit un problème.

Si vous avez les "données brutes" sous la forme d'un tableau, alors votre utilisation d'un bloc d'itérateur sera plus efficace qu'appeler Reverse. La méthode Reverse mettra en mémoire tampon toutes les données avant de les transmettre un élément à la fois, exactement comme le fait votre propre code. Cependant, appeler simplement Reverse serait beaucoup plus simple ...

En dehors de toute autre chose, je dirais que cela vaut la peine d'apprendre LINQ - au moins LINQ to Objects. Il peut rendre les données de traitement beaucoup, beaucoup plus propre qu'avant.

+0

Merci à tous et nous suivrons vos conseils. – user160677

+0

notre chef de projet a juste lancé une commande que "même pendant ses jours d'école il n'a pas développé une telle mauvaise ligne de codage". Nous avons été choqués, c'est la raison pour laquelle nous avons posté ceci. Merci à tout le monde. – user160677

1

Deux questions:

  1. Est-ce que le code que vous avez actuellement des travaux?
  2. Avez-vous identifié ce morceau de code comme étant votre goulot d'étranglement?

Si la réponse à l'une ou l'autre de ces questions est non, ne vous inquiétez pas. Juste le faire fonctionner et passer à autre chose. Il n'y a rien de grossier dans le code, donc pas besoin de s'inquiéter! Passez votre temps à construire de nouvelles fonctionnalités à la place. Enregistrer LINQ pour un nouveau problème que vous n'avez pas encore résolu.

+0

Oui, ça fonctionne bien. Merci Rex. – user160677

0

Votre méthode GetDocuments a un type de IEnumerable de retour donc il n'y a pas besoin de boucle, même sur votre tableau lorsque IsReverseOrder est faux, il vous suffit de le retourner comme cela est le type Array est IEnumerable ...

En ce qui concerne Lorsque IsReverseOrder est true, vous pouvez utiliser Array.Reverse ou la méthode d'extension Linq Reverse() pour réduire la quantité de code.

+0

Merci Simon:) – user160677

Questions connexes