Variable initalisation dans la boucle while
J'ai une fonction qui lit un fichier en morceaux.
public static DataObject ReadNextFile(){ ...}
Et dataobject ressemble à ceci:
public DataObject
{
public string Category { get; set; }
//And other members ...
}
Ce que je veux faire est la suivante fondamentalement
List<DataObject> dataObjects = new List<DataObject>();
while(ReadNextFile().Category == "category")
{
dataObjects.Add(^^^^^ the thingy in the while);
}
Je sais que c'est probablement pas la façon dont c'est fait, parce que comment puis-je accéder à l'objet que je viens de lire.
êtes-vous sûr de ce que vous voulez demander de plus?
- Je avoir un moment difficile essayer de comprendre exactement ce que vous voulez.
Je suis désolé, je me rends compte que ma question est très vague. C'est juste comment puis-je accéder à l'objet dans le temps(ReadNextElement()) :p
Re la boucle de la logique, est-ce vraiment ce que vous voulez faire? Ne préféreriez-vous pas lu tous les "matching" DataObjects à partir du fichier, si il y a d'autres entre les deux ou pas?
Juste pour mémoire: suis-je en droit de dire que votre vrai
- Je avoir un moment difficile essayer de comprendre exactement ce que vous voulez.
Je suis désolé, je me rends compte que ma question est très vague. C'est juste comment puis-je accéder à l'objet dans le temps(ReadNextElement()) :p
Re la boucle de la logique, est-ce vraiment ce que vous voulez faire? Ne préféreriez-vous pas lu tous les "matching" DataObjects à partir du fichier, si il y a d'autres entre les deux ou pas?
Juste pour mémoire: suis-je en droit de dire que votre vrai
DataObject
contient plus de biens que de simplement la catégorie que vous faites des tests?
OriginalL'auteur Timo Willemsen | 2010-12-13
Vous devez vous connecter pour publier un commentaire.
Je pense que ce que vous cherchez est:
Mais je ne le ferais pas. Allais-je écrire:
où
ReadItems()
était une méthode retournant unIEnumerable<DataObject>
, la lecture et le rendement d'un seul élément à la fois. Vous pouvez bien voulez la mettre en œuvre avec un itérateur bloc (yield return
etc).C'est en supposant que vous voulez vraiment arrêter de lire dès que vous trouvez le premier objet qui a une catégorie différente. Si vous souhaitez inclure tous la correspondance
DataObject
s,changement
TakeWhile
àWhere
au-dessus d'une requête LINQ.(EDIT: Saeed a depuis supprimé son opposition à la réponse, mais je suppose que je pourrais aussi bien laisser l'exemple...)
EDIT: la Preuve que cela fonctionne, que Saïd n'a pas l'air de me croire:
De sortie:
En d'autres termes, la liste a conservé les références à l'5 objets distincts qui ont été renvoyées de
ReadNextFile
.OriginalL'auteur Jon Skeet
C'est subjectif, mais je déteste ce modèle (et je suis parfaitement conscient que je suis dans la très petite minorité ici). Voici comment je le fais quand j'ai besoin de quelque chose comme cela.
Mais ces jours, il est préférable de dire
Ici, bien sûr,
GetItemsFromFile
lit les éléments à partir du fichier pointé parpath
et renvoie unIEnumerable<DataObject>
.C'est une réponse qui ne répond pas à la question. À mon avis, ce qui en fait une mauvaise réponse. Cette réponse, toutefois - celui que vous avez downvoted - t répondre à la question. Pouvez-vous donner tous la raison pour downvoting il des autres parce que vous êtes fâché que d'autres ont downvoted votre réponse?
Pourquoi "LINQ pas une réponse?" Que voulez-vous dire "le premier n'est pas de l'adresse de
OP
s signature" (sic).La question écrite pas répondre tout en gardant la
while(ReadNextFile().Category == "category")
partie (ce qui n'est pas une signature, par la voie). Je vois que vous êtes également en supposant que que upvotes pour cette réponse sont dues à l'amitié plutôt que de simplement d'accord avec la réponse... et vous êtes également en supposant que que les downvotes exprimés contre vous correspondent avec les upvotes pour cette réponse. Ils ne dans mon cas, mais vous ne devriez pas supposer que c'est vrai pour les autres.Euh, je suis pas de parler pour les autres, c'est le point que vous avez
OriginalL'auteur jason
Et si vous avez plus compliqué objet, vous pouvez le faire (comme jon):
Désolé, mon commentaire précédent n'a apparemment pas le faire - je suis sur une pâte feuilletée 3G connexion réseau. Ce ne compile pas, parce que vous essayez d'ajouter une chaîne à une
List<DataObject>
. L'idée n'est pas de se rappeler la dernière catégorie, c'est de se rappeler la dernièreDataObject
. Voir ma réponse pour la version fixe.Skeet, j'avais modifié la réponse, merci, je ne pense pas que le type de liste, je veux juste montrer le chemin
OP
veut.Maintenant, Vraiment, je ne comprends pas les downvotes après mon montage?
6 ans plus tard, il est toujours une mauvaise réponse. Le premier extrait de code NE PAS FAIRE CE que l'OP a DEMANDÉ. En effet, il ne fait rien que quelqu'un est probable que jamais envie de faire. Ce qui en fait une perte de temps d'essayer de faire sens de cette réponse. Le deuxième extrait de code fait ce qui est demandé, mais il est mal écrit: (1) la variable
category
est mal nommée, car elle ne contient plus d'une catégorie. (2) la variablecategory
est initialisé à une valeur par défaut DataObject. Pourquoi? Il n'a pas besoin d'être initialisé à tous dans ce cas, car elle est uniquement utilisée dans la boucle. Si quoi que ce soit, l'initialiser à null.OriginalL'auteur Saeed Amiri
Vous devriez regarder dans la mise en œuvre de IEnumerator sur la classe contenant l'appel à ReadNextFile(). Ensuite, vous auriez toujours référence à l'objet courant avec IEnumerator.Actuel, et MoveNext() retourne la valeur booléenne que vous recherchez pour vérifier l'avancement. Quelque chose comme ceci:
Je suis d'accord vous n'avez pas BESOIN, mais si c'est le but de cet objet (qui, on dirait que c'est), il semble que c'est une solution plus élégante de l'OMI.
La création d'un type de manière explicite et en utilisant ensuite il est plus élégant que d'écrire une méthode utilisant un itérateur bloc? Je vous suggère d'essayer l'écriture d'une solution complète de deux façons et puis juger à nouveau...
Si vous regardez ce qu'il demande, et ne pas essayer d'ajouter quelque chose, oui, un itérateur est la plus petite, la solution la plus rapide. Basé sur ce qu'il a été demandé si, il semblait comme passer par une liste d'objets et d'examiner ce que l'élément courant exactement miroirs le but de la IEnumerator, d'où la suggestion.
Si vous créez un itérateur bloc, vous pouvez toujours utiliser l'généré
IEnumerator<DataObject>
. Le code appelant serait le même de toute façon - l'itérateur bloc vous permet d'économiser beaucoup de tracas. Comme je l'ai dit, vous devriez essayer de la mise en œuvre de deux façons...OriginalL'auteur poindexter12