2017-08-09 113 views
1

这是一个关于编译器/语言如何处理这个问题的问题。 采取以下代码:来自字符串数组的C#max()并不总是最大的数字

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

输入一个字符串,如“1,2,3,4,5”将输出5作为最大数量。 然而,使用“1,2,3,5,5,6”输出6.而“33,1,4,1”给出了4.奇怪的是,“33,1,2,3”给出了33.

我知道有一个更好/更简单/不同的使用循环的方式。我完全错过了编译器如何处理这些字符串以确定输出。有人可以解释吗?或者提供一个参考来查看它?

+0

注意'splitNumber'是String' – CinCout

回答

8

“最大”字符串在字典顺序最后一个字符串,即你会列出它们在字典中

您需要使用例如订单int.Parse将字符串转换为数字类型,如果您想要数字最大值。

+0

的'阵列到目前为止,这是解释发生了什么的唯一答案......以 –

+0

开头的问题是啊!有道理!谢谢 –

7

在字符串比较,6> 55.而是执行此操作:

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

打印 “最高的是:55”

1

您需要的数量比较从列表或数组整数。

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

你可以做到这一点,字符串数组转换为数组INT使用ConvertAll然后找到最大

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

你也可以这样做:

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

变化瓦尔到Int64

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

瓦尔最多只接受5位数字。 –

1

我试过编译用相同的输入代码。我也得到了相同的输出,但是当我尝试对字符串数组执行.Max()操作时,它只会比较第二个数组中每个条目的第一个字符。

如果输入1,2,3,55,6你会得到的输出作为,因为当你比较所有的数字和有第一位是最大的。但是,如果您将输入更改为1,2,3,75,6,则您将获得输出为,因为是列表中所有数字中最大的第一位数字。

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

像所有其他答案你需要将字符串数组转换为整数数组,然后将其应用。

1

Ans for 编译器如何处理这些字符串以确定输出?

由于这些是字符串,因此会检查字符串相等性。 编译器获取每个字符串值并将其与逐个字符进行比较。它推导平等于失配的第一次出现(例如,在55比6,5小于6,所以图55是小于6)