2009-08-25 5 views
2

J'ai une liste de recherche simple que je vais utiliser pour remplir une liste déroulante dans Silverlight. Dans cet exemple, j'utilise des États américains.Est-il préférable de générer des listes de recherche de retour ou de précharger une liste statique dans C#?

J'essaie de savoir s'il vaut mieux retourner une liste statique ou utiliser le mot-clé yield. Parmi les deux morceaux de code suivants, lequel est le préféré et pourquoi?

Version 1: Utiliser yield return

public class States 
{ 
    public static IEnumerable<string> GetNames() 
    { 
     yield return "Alabama"; 
     yield return "Alaska"; 
     yield return "Arizona"; 
     yield return "Arkansas"; 
     yield return "California"; 
     yield return "Others ..."; 
    } 
} 

Version 2: Retour la liste

public class States 
{ 
    private static readonly IList<string> _names; 

    static States() 
    { 
     _names = new List<string>() {"Alabama", 
            "Alaska", 
            "Arizona", 
            "Arkansas", 
            "California", 
            "Others ..." }; 

    } 

    public static IList<string> GetNames() 
    { 
     return _names; 
    } 
} 

Répondre

1

La question que vous devez vous poser est la suivante: « Est-ce que je veux le code qui appelle GetNames pour pouvoir modifier la liste? »

  • Si la réponse est oui, revenir un IList, en disant implicitement: "lecture-écriture"
  • Si la réponse est non, le retour d'un IEnumerable, en disant implicitement: "lecture seule"

De toute façon, je pense que vous devriez mettre les noms d'état dans un fichier de ressources, plutôt que de les coder en dur (même si cette liste ne devrait pas changer à court terme ...)

Voici ce que je ferais:

public static IEnummerable<string> GetNames() 
{ 
    foreach(string name in _names) yield return name; 
} 

De cette façon, vous n'exposez pas directement la liste au « monde extérieur »

+0

Attention à ce que quelqu'un au moins essaie: IList list = ((IList) SomeMethodThatReturnsEnumerable()) –

+0

Oui, c'est techniquement faisable ... à condition qu'il soit en fait * un * IList (ce qui ne serait pas le cas pour le code V1). Quoi qu'il en soit, le type de retour indique l'intention, qui est de fournir une liste en lecture seule, mais cela n'empêche pas les opérations "illégales". –

+0

voulez-vous dire «rendement rendement» dans votre échantillon? – bendewey

1

Je pense que je préfère la liste pour cela. Le seul avantage que la méthode yield peut offrir sur la liste ici est d'éviter de devoir conserver tous les éléments en mémoire en même temps, mais vous allez le faire de toute façon.

+0

Est-ce que le fait que les objets ne sont en mémoire lors de leur utilisation fournir un avantage? Ou le temps de chargement surpasserait-il le coût de la mémoire? – bendewey

+0

Ils * sont * toujours en mémoire, puisque le code est chargé en mémoire ... –

+0

C'est un peu mon point. –

0

Personnellement, je préférerais la Liste sur l'itérateur, bien que je chercherais aussi à incorporer une ressource contenant une telle liste (peut-être XML, peut-être du texte) dans votre assemblage et à lire dans votre constructeur statique.

Questions connexes