Mettre en œuvre IEnumerable sur la propriété
En supposant que la classe
public class Foo
{
public List<Bar> Bar = new List<Bar>();
public string Something;
public TStatus Status;
}
Bar est une classe définie comme
public class Bar
{
public string Code;
public string Message;
public TStatus Status;
}
J'ai besoin d'itérer la Barre de la liste, mais je ne peux pas utiliser un foreach parce que j'ai besoin pour mettre en œuvre IEnumerable je suis un peu novice et j'ai du mal à trouver comment la mettre en œuvre, toute aide appréciée.
List<Bar>
implémente déjàIEnumerable
. Pourquoi pensez-vous que vous devez le faire vous-même?- Parlez-vous à répéter le
Bar
liste? ou parlez-vous d'une certaine manière itération les membres de chaqueBar
? Vous avez déjà itérer une Liste<t> objet. - Pourriez-vous poster le code qui ne compile pas? Il y a beaucoup de réponses ci-dessous, mais de toute façon, je ne pense pas que ces décrivez votre problème.
- Pourquoi êtes-vous à l'aide de champs publics plutôt que des propriétés?
- suis un peu novice..."
- Ok. Je vais recommander que vous passez à des propriétés, puisque vous pouvez ajouter de la logique à eux et de les remplacer (si vous les définissez comme virtuel)
- Le code que j'ai posté n'a compiler. Il fait partie d'un webservice, lors de l'écriture d'un client à l'interface à cela le retour de foo contenant une liste de n de la barre de champs. Sur le côté client je ne peux pas utiliser un foreach pour itérer car "Erreur 1 instruction foreach ne peut pas fonctionner sur des variables de type 'Foo', parce que 'Foo' ne contient pas une définition publique pour "GetEnumerator'"
- J'ai réalisé que le problème est lorsqu'il est exposé comme un service web la Liste est définie sous la forme de tableaux de perdre la possibilité de les énumérer. C'est une autre question complètement, merci pour votre aide.
Vous devez vous connecter pour publier un commentaire.
Un couple de choses:
1.) Quant à votre question réelle, vous avez deux options:
Vous pouvez effectuer une itération sur les
Bar
champ (ou bien, si vous la changez pour une propriété comme indiqué ci-dessous) dans votre code:Ou vous pouvez faire
Foo
mettre en œuvreIEnumerable<Bar>
(c'est plus compliqué):Cela vous permettra de le faire:
Personnellement, je vous recommande la première option. C'est plus simple, et moins
Foo
vraiment est (plutôt que juste a) une collection deBar
objets, alors il semble plus intuitive.2.) Ce que vous avez ci-dessus ne sont pas des propriétés, ils sont les champs publics. Une propriété a un getter et un setter, et ressemble à quelque chose comme ceci:
Propriétés généralement de faire fonctionner sur une seule variable, appelé un magasin de sauvegarde. Pour les biens ci-dessus, quelque chose comme ceci:
À proprement parler, vous pouvez mettre absolument tout le bloc de code qui renvoie une chaîne de caractères dans le
get
bloc, et vous pouvez mettre n'importe quoi dans leset
bloc (y compris rien, si ce n'est pas une bonne idée).Propriétés vous permettent de définir quelque chose qui se comporte comme un champ (comme vous pouvez affecter à l'aide du signe égal), mais qui utilise le comportement que vous spécifiez lorsque la valeur est récupérée ou de l'ensemble. Cependant, l'une des questions très simples propriétés (qui vient directement obtenir/définir une sauvegarde de variable sans aucune autre logique), c'est que c'est un peu verbeux pour ce qu'il fait réellement. C'est pourquoi C# 3.0 a introduit le concept d'auto propriétés, qui ressemble à ceci:
Ici,
Something
semble un peu comme un champ, mais c'est en fait une propriété. Le compilateur C# reconnaît cette syntaxe (en remplaçant les blocs de code pour les deuxget
etset
avec juste un point-virgule) et crée une sauvegarde de variable pour vous et insère le code pour lire et écrire.Vous pouvez le faire comme ceci:
Par ailleurs, si vous souhaitez que ces propriétés, les champs privés, donc:
Garde maintenable dans de nombreux autres contextes.
Vous devriez être en mesure d'effectuer une itération sur les membres de
Bar
assez facilement à l'aide deforeach
. Vous n'avez pas besoin de mettre en œuvreIEnumerable
ici depuisList<>
déjà fait pour vous:Suppose que vous voulez pour ce faire:
Vous pouvez itérer
List<T>
comme est.Aussi, Vous devriez être en utilisant des propriétés ou de l'auto-propriétés d'exposer la
List<T>
, etc. Champs publics est une mauvaise pratique.Classe:
Itération:
Je vais faire un saut ici que ce que vous essayez de faire est d'ajouter une propriété à votre
Foo
classe qui retourne unIEnumerable
, ouIEnumerable<Bar>
et que cette propriété a besoin pour effectuer une sorte de filtrage sur la liste deBar
les objets contenus dans leFoo.Bar
champ.EDIT: Si cela ne ressemble pas à ce que vous êtes en train de faire, alors que cette réponse est peut-être pas pour vous. S'il vous plaît ne laissez pas ma réponse vous conduire à une plus grande confusion.
Voici mes hypothèses sur le problème:
Foo
etBar
sont classes imbriquées à l'intérieur d'une autre classe, etTStatus
est un paramètre générique sur celui contenant la classe.Foo
qui renvoie une collection deBar
les objets qui ont unStatus
propriété est égale à laFoo
de l'objetStatus
de la propriété. Je suis juste une supposition ici, mais j'ai pensé que peut-être la raison pour laquelle vous avez unStatus
de propriété sur les deuxFoo
etBar
.Ci-dessous est une mise en œuvre complète qui offre un
BarsFilteredByStatus
bien sur laFoo
classe. Il utilise .NET itérateur fonctionnalité pour offrir une collection filtrée deBar
objets oùBar.Status
est égal àFoo.Status
. Si cela semble être quelque chose le long des lignes de ce que vous êtes après, alors allez-y, prenez ce code et de jouer avec elle.Le code suivant fonctionne pour moi:
Vous devriez nom de votre instance de Liste autres que la Barre pour éviter toute confusion.