2017-08-09 1 views
1

Ceci est une question sur la façon dont le compilateur/langage traite de cela. Prenez le code suivant:C# max() à partir du tableau de chaînes pas toujours le plus grand nombre

Console.WriteLine("Enter some numbers separated by ","); 
var numbers = Console.ReadLine(); 
var splitNumber = numbers.Split(','); 
var maxNumber = splitNumber.Max(); 
Console.WriteLine("highest is: " + maxNumber); 

Saisie d'une chaîne telle que « 1,2,3,4,5 » sortira le 5 comme le nombre maximum. Cependant, en utilisant "1,2,3,55,6" sorties 6. Alors que "33,1,4,1" donne 4. Bizarrement, "33,1,2,3" donne 33.

Je sais qu'il existe une meilleure façon de faire cela en utilisant une boucle. Il me manque totalement quelque chose avec la façon dont le compilateur traite ces chaînes pour déterminer la sortie. Quelqu'un peut-il l'expliquer? Ou me fournir une référence pour le regarder?

+0

Notez que 'splitNumber' est un tableau de' String' – CinCout

Répondre

8

La chaîne « max » est la dernière chaîne en ordre lexicographique, à savoir l'ordre que vous les énumérer dans un dictionnaire

Vous devez utiliser par exemple int.Parse pour convertir vos chaînes en un type de nombre si vous voulez le maximum numérique.

+0

Jusqu'à présent, c'est la seule réponse expliquant ce qui se passe ... Quelle était la question pour commencer –

+0

Ahh! C'est logique! Merci –

7

En comparaison de chaînes, 6> 55. Pour ce faire, à la place:

string x = "1,2,3,55,6"; 
var array = x.Split(','); 
Console.WriteLine("highest is: " + array.Max(c => int.Parse(c))); 

Prints "est le plus élevé: 55"

1

Vous devez comparer le nombre de ints d'une liste ou un tableau.

var <int> Numbers = new List<int>(); 
while(String had not ended) 
{ 
    var splitNumber = (int) numbers.Split(','); 
    Numbers.Add(splitNumner); 
}   
var maxNumber = Numbers.Max();   
Console.WriteLine("highest is: " + maxNumber); 
1

Vous pouvez le faire, convertir le tableau de chaînes à un tableau de int en utilisant ConvertAll puis trouver le max

Console.WriteLine("Enter some numbers separated by "); 
    var numbers = Console.ReadLine(); 
    var splitNumber = numbers.Split(','); 
    int[] myInts = Array.ConvertAll(splitNumber, int.Parse); 
    var maxNumber = myInts.Max(); 
    Console.WriteLine("highest is: " + maxNumber); 
0

Vous pouvez aussi le faire:

var splitNumber = numbers.Split(',').Select(c=>Convert.ToInt32(c)).Max(); 
Console.WriteLine("highest is: " + splitNumber); 
0

changement Var à Int64

Int64 maxNumber = Int64.Parse(splitNumber.Max()); 
+0

Var accepte seulement un maximum de 5 chiffres. –

1

J'ai essayé compil votre code avec les mêmes entrées. J'ai également obtenu la même sortie mais je chose quand vous essayez d'exécuter l'opération. Max() sur un tableau de chaînes, il compare seulement le premier caractère de chaque entrée dans votre deuxième tableau.

Si l'entrée est 1,2,3,55,6 tu vas obtenir la sortie comme parce que quand vous comparez tous les chiffres et il premier chiffre est le plus grand. Mais si vous modifiez l'entrée à 1,2,3,75,6 maintenant vous allez obtenir la sortie comme car est le plus grand premier chiffre de tous les nombres dans la liste.

string str = "1,2,3,75,6"; 
var splitNumber = str.Split(','); 
var maxNumber = splitNumber.Max(); 

Comme toutes les autres réponses, vous devez convertir le tableau de chaînes en un tableau d'entiers, puis l'appliquer.

1

Ans pour comment le compilateur traite ces chaînes pour déterminer la sortie?:

Comme ce sont des chaînes, l'égalité des chaînes est vérifiée pour cela. Le compilateur prend chaque valeur de chaîne et la compare à un caractère un par un.déduit l'égalité sur la première occurrence de discordance (par exemple dans 55 vs 6, 5 est inférieur à 6, donc 55 est inférieur à 6)