J'essaie de mettre à jour un paramètre de chaîne et de retourner une autre chaîne avec le numéro de version mis à jour.
Exemple d'entrée et sortie: P>
static void Main(string[] args)
{
string user_input;
Console.WriteLine("Hello");
Console.WriteLine("Please input the version number to increment: ");
user_input = Console.ReadLine();
string new_version_number = next_Version(user_input);
Console.WriteLine("Your number is : {0}", new_version_number);
Console.ReadKey();
}
public static string next_Version(string user_input)
{
//removing . for parsing
string string_no_dots = user_input.Replace(".", "");
//storing length to see if incrementing from version x99 to 100
int string_length = string_no_dots.Length;
//convert to int to increment version
int number_no_dots;
int.TryParse(string_no_dots,out number_no_dots);
//increment by 1
int new_version_number = number_no_dots+1;
//convert back to string
string new_version_string = Convert.ToString(new_version_number);
//add the periods
string string_with_dots = String.Join<char>(".", new_version_string);
return string_with_dots;
}
3 Réponses :
Ceci a fonctionné pour moi, je l'ai fait dans un violon testé et travaillant
En gros, il vérifie simplement si la longueur du nombre (en caractères) et si Son plus gros que la longueur de nombre + 1 dans les caractères, elle le convertit à 0 puis ajoute le 1 au numéro suivant, je devrais ajouter 1 zéro pour chaque longueur que cela ne soit que fonctionnaire pour votre problème. P>
EDIT: NVM a fait fonctionner pour le cas lorsque plusieurs 0s sont nécessaires P>
IE: 1,99 == 2.00 au lieu de 1,99 == 2.0 P>
Lien de violon: https://dotnetfiddle.net/wvqhvu p>
using System;
public class Program
{
public static void Main()
{
Console.WriteLine(next_Version("1.2.3.4"));
Console.WriteLine(next_Version("11.2.3"));
}
public static string next_Version(string version)
{
string[] a = version.Split('.');
int x = a.Length;
int carrying = 1;
while(x>0){
int number = Convert.ToInt32(a[x-1]);
if(Convert.ToString(number+carrying).Length > Convert.ToString(number).Length){
string zeroes = "";
foreach(char c in Convert.ToString(number)){
zeroes += "0";
}
a[x-1] = zeroes;
carrying = 1;
}else{
a[x-1] = Convert.ToString(number+carrying);
carrying = 0;
}
x--;
}
String result = "";
foreach(string s in a){
result+=s+".";
}
return result.TrimEnd('.');
}
}
Essayez quelque chose comme ça:
public static string next_Version(string user_input)
{
try
{
int[] values = user_input.Split(".".ToCharArray()).Select(s => Convert.ToInt32(s)).ToArray();
bool carryover;
int index = values.Length - 1;
do
{
carryover = false;
values[index]++;
if ((index > 0) && (values[index] == 10))
{
values[index] = 0;
carryover = true;
index--;
}
} while (carryover && (index >= 0));
return String.Join(".", values);
}
catch (Exception)
{
return "[ Invalid Version Input! ]";
}
}
Notez que cela ne vérifie pas si un numéro autre que le premier numéro était déjà supérieur à 10. Je ne vérifie que si c'était exactement 10 après l'ajout. Si vous souhaitez un nombre supérieur à 10 pour réinitialiser à zéro et n'écrénez que le numéro suivant par un, changez == 10 code> sur > = 10 code>.
Ne serait-il pas préférable de simplement vérifier la longueur d'origine de la chaîne et la comparer à la nouvelle? (Pour que cela puisse fonctionner pour des versions telles que 2.00.1)
@Ivan je ne comprends pas votre commentaire. Expliquer mieux et je peux répondre.
@Ivan je vois ce que tu dis. Ça va convertir 00 code> à juste 0 code>. Je ne sais pas si tel est un "bogue" ou une "fonctionnalité" à ce stade, car il n'était pas couvert dans les spécifications.
Oui, ce n'était pas précisé mais je me demandais simplement s'il serait juste mieux dans l'ensemble de couvrir les cas. (Quoi qu'il en soit, votre réponse va bien et fonctionne pour le cas de la question).
@IVAN Qu'en est-il de cette affaire? 2. 000. 1 code>. Les valeurs à l'intérieur peuvent être converties en chiffres, mais devrions-nous garder la longueur totale avec les espaces inclus?
Je dirais que dans le cas spécifique, la chaîne est mal formée et que les espaces blanchisseurs devraient être coupés avant de faire quoi que ce soit (s'ils ne sont pas déjà en les convertissant en chiffres), ou simplement pour empêcher cela, les transformer en chiffres et obtenir la longueur après les transformer en chiffres
@IVAN Mais si seule la première entrée peut aller au-dessus de 9, toutes les entrées ne doivent être qu'un chiffre. Pourquoi auriez-vous "00" dans cette seconde fente, si cela ne peut être que "1" à "9"? Cela ne serait-il pas mal formé par votre définition?
Le «000» au milieu est automatiquement converti en '0' dès que la chaîne est faite en un nombre, après avoir été transformée en un nombre, il devrait prendre en compte sa longueur.
@IVAN Oui, mais la longueur ne sera jamais un chiffre! ... à moins que ce soit la toute première fente qui puisse passer plus de 9 ans.
Je vois ce que vous voulez dire, dans ce cas, la vérification de la longueur peut fondamentalement peut être appliquée à plus de cas, mais pour celui-ci n'est qu'une réponse plus lente
@Idle_mind Pourriez-vous expliquer cette partie Int [] values = user_input.split (".". Tochararray ()). Sélectionnez (S => Convert.Toint32 (s)). TOARRAY ();
Sûr. Cela divise d'abord la version dans une matrice à chaîne avec String.Split (). Ensuite, à partir de ce tableau résultant, une requête LINQ est effectuée avec la partie SELECT (). Cette requête passe chaque élément de la matrice de chaîne via le Expression Lambda à l'intérieur de l'instruction SELECT (). Chaque élément est référencé avec la variable "S", qui est transmise dans convert.toint32 (). Il en résulte une collection d'entiers énumérables qui est enfin convertie en une matrice INT avec TOARRAY ().
Je suggère une approche comme ceci: Il divise la chaîne dans une matrice et convertit chaque partie en int. Il fonctionne ensuite sur l'INT, puis ré-reconstruit la chaîne de version des valeurs INT. P> p>
C'est un plus joli, récursif b>, version de ma soumission. Bien fait.
Donc c'est. Je promets que je n'avais pas vu votre réponse quand j'ai posté le mien pendant que vous l'avez posté pendant que j'éclurais le mien, mais comme on dit: les grands esprits se ressemblent.
Lol ... J'espère que mon commentaire n'est pas tombé aussi en colère ni en colère. J'aime ta soumission! =)
Non, tout n'a pas du tout. J'ai pris les parties "jolie" et "bien fait" au cœur. J'essaie juste d'éviter de poster des réponses en double, mais cela ne peut pas toujours être fait. :)
Avez-vous envisagé de tirer parti de la classe code> code> au lieu de travailler sur des chaînes?
Vous devriez essayer la scission (string.split) la chaîne dans un tableau et ajouter 1 au dernier numéro de la matrice si le résultat est plus grand que 9 puis passez au numéro précédent et répétez le processus.
Il y a beaucoup de choses qui peuvent être améliorées ici, mais pas le point. Où est
tous les numéros, à l'exception du premier, ne doit pas être supérieur à 10 code> implémenté dans votre solution?Vous avez déjà fourni des étapes que votre code devrait suivre - «Breakez la chaîne à part -Incrimement par un-suffriez» - pourquoi le code que vous avez posté fait des trucs fous comme supprimant les points alors? Et où est le code pour correctement "incrémenter par un" avec transporter? Pas exactement sûr de l'aide exacte dont vous avez besoin à ce stade i> ...
Note latérale: Bien qu'il s'agisse d'un exercice divertissant, n'utilisez pas cela pour les versions réelles - lisez quelque chose sur «Versions sémantiques» pour voir comment les numéros de version sont généralement utilisés.
@Alexeilevenkov ou tirer parti des autres classes / implémentations disponibles au lieu de réinventer la roue i> ... Je pense que cela peut être un exercice ou une mission?
@Broottswaymb je vais regarder dans cette classe et voir si cela peut aider avec ce que j'essaie d'accomplir
@Alexeilevenkov Je n'ai aucune intention d'utiliser ceci pour un versement. Comme Çöđěxěŕŕ le met, c'est pour un exercice.
Je me demande ce qui se produirait si un étudiant entrepreneur a été mis au travail qui a utilisé le bon outil pour le travail,
system.version code> par exemple.@Natpongjardenlarp qui serait inimaginable. Nous devons avoir des étudiants de construire à partir de zéro plutôt que d'utiliser les outils dont beaucoup ont contribué à sa création :)