Est-t-il un équivalent pour le Scanner de classe en C# pour les chaînes?
En Java, je peux passer un Scanner, une chaîne et puis je peux faire des choses pratiques comme, scanner.hasNext()
ou scanner.nextInt()
, scanner.nextDouble()
etc.
Cela permet à certains assez propre code pour l'analyse d'une chaîne de caractères qui contient des lignes de chiffres.
Comment cela est possible en C# terre?
Si vous aviez une chaîne qui disent avait:
"0 0 1 22 39 0 0 1 2 33 33"
En Java, je voudrais passer que pour un scanner et faire un
while(scanner.hasNext())
myArray[i++] = scanner.nextInt();
Ou quelque chose de très similaire. Qu'est-ce que le C#' ish façon de le faire?
- De l'intérêt (pour nous C# les gens) pourriez-vous montrer le code de la façon dont un scanner est initialisée par exemple, avez-vous besoin de lui dire le type de numérisation pour?
- Scanner s = new Scanner(entrée) où l'entrée est beaucoup de différents types de choses (String, Fichier, Lisible, InputStream, etc..) java.sun.com/javase/6/docs/api/java/util/Scanner.html. Il y a aussi hasNext (comme hasNextInt()) méthodes pour voir si ce que vous cherchez est la prochaine chose à lire.
- Il dispose également d'un générique hasNext() tout simplement pour voir s'il y a des jetons de n'importe quel type de gauche dans la chaîne.
Vous devez vous connecter pour publier un commentaire.
Je vais ajouter cela comme une réponse distincte parce que c'est tout à fait distincte de la réponse, j'ai déjà donné. Voici comment vous pouvez commencer à créer votre propre Scanner classe:
D'utiliser une partie des réponses déjà données, j'ai créé un
StringReader
qui permet d'extraireEnum
et tout type de données qui implémenteIConvertible
.Utilisation
Mise en œuvre
Alors que ce n'est pas exactement le même concept de base, ce que vous cherchez peut être fait avec cette expression lambda:
Ce que cela fait, c'est d'abord
Split
lastring
, à l'aide d'un espace comme séparateur. LeSelect
fonction vous permet de spécifier un alias pour un membre donné dans le tableau (que j'ai appelé 'p
" dans cet exemple), puis effectuer une opération sur ce membre pour donner un résultat final. LeToArray()
appel, puis se transforme cet abrégé énumérable classe dans un béton de tableau.Donc, à cette fin, le présent divise le
string
, puis convertit chaque élément dans unint
et remplit unint[]
avec les valeurs obtenues.À ma connaissance, il n'y a pas de classes dans le cadre pour le faire. Vous devez rouler votre propre.
Qui ne serait pas trop dur. Une belle version de C# pourrait mettre en œuvre IEnumerable, alors on peut dire:
Aussi proche que possible de votre syntaxe, ça va fonctionner que si vous êtes seulement intéressé par un type ("int" dans l'exemple):
Voici encore plus whiz-bang version qui vous permet d'accéder à n'importe quel type qui est pris en charge par la chaîne de IConvertible mise en œuvre:
Il suffit de passer d'un type différent de la "typeof" opérateur dans la boucle while permet de choisir le type.
Ces deux nécessitent la dernière version de C# et de la .NET framework.
Vous pouvez utiliser linq pour accomplir cette manière:
Je voudrais le faire de deux façons, selon que 1) vous utilisez la dernière .NET framework avec le support LINQ et 2) les valeurs sont valables entiers. Voici une fonction pour démontrer à la fois:
Sur la base des observations dans d'autres réponse(s), je suppose que vous avez besoin de la validation. Après la lecture de ces commentaires, je pense que la chose la plus proche que vous obtiendrez est de type int.TryParse et double.TryParse, qui est une sorte de combinaison de hasNextInt et nextInt (ou une combinaison de hasNextDouble et nextDouble).