C# 用Linq求负数数列的最小值
下面的代码没有给出预期的最小值-1。相反,我得到了0。 你知道为什么吗C# 用Linq求负数数列的最小值,c#,linq,numbers,range,minimum,C#,Linq,Numbers,Range,Minimum,下面的代码没有给出预期的最小值-1。相反,我得到了0。 你知道为什么吗 class MainClass { public static void Main (string[] args) { string numbers = "-1 0 1 2 3 4 5"; Console.WriteLine (numbers.Split (' ')[0]); // output: -1 string max = numbers.Spli
class MainClass
{
public static void Main (string[] args)
{
string numbers = "-1 0 1 2 3 4 5";
Console.WriteLine (numbers.Split (' ')[0]); // output: -1
string max = numbers.Split(' ').Max();
string min = numbers.Split(' ').Min();
Console.WriteLine("{0} {1}", max, min); // output: "5 0"
}
}
这是一个字符串,所以从字符串中获取最大值与从数字中获取最大值完全不同。例如,如果您有一个如下所示的数组 char[]someCharArray=新字符[]{'1','12','2'} 在此数组上调用Max()将导致2,因为2在字符串顺序上比12“高” 考虑字符串/字符的最大/最小值,您需要考虑字母顺序。如果有字母a-Z的集合,则调用Min()将返回a,调用Max()将返回Z 要以数字顺序获得Max/Min,您需要转换为一些数字类型,如int。 见下文:
string numbers = "-1 0 1 2 3 4 5";
int min = numbers.Split(' ').Select(x => int.Parse(x)).Min();
Console.WriteLine(min); // gives You -1
我还没有完全定义一个答案,但它似乎是因为
-
没有被考虑。。您可以使用CompareOrdinal
Console.WriteLine(String.CompareOrdinal("-1", "0")); // -3 meaning -1 min
Console.WriteLine(String.Compare("-1", "0")); // 1 meaning 0 min
无论哪种方式,你都试图比较数字,所以你应该把它们当作数字对待,这样类似的微妙之处就不会出现
试图解释 字符串实现了
IComparable
,因此使用该实现(请参见备注)。这反过来又使用
现在在这个方法的注释中
字符集包括可忽略的字符。CuffReAto(String)方法在执行对文化敏感的比较时不考虑这些字符。例如,如果在.NET Framework 4或更高版本上运行以下代码,则将“animal”与“animal”进行比较(使用软连字符或U+00AD)表明这两个字符串是等效的
(强调矿山)
如你所见。忽略
-
,因此在ascii表中具有较小值的0用于比较此行为有两个原因:
String.CompareTo()
来比较字符串String.CompareTo()
对-
具有特殊行为,它将其视为连字符而不是减号。(注意:此连字符不应与字符代码为U00AD的软连字符混淆。)Console.WriteLine("-1".CompareTo("0")); // 1
Console.WriteLine("-1".CompareTo("1")); // 1
Console.WriteLine("-1".CompareTo("2")); // -1
请注意,与直觉相反,“-1”在“0”和“1”之后,但在“2”之前
这解释了为什么在对字符串排序时“-1”既不是最大值也不是最小值
但为什么它会给我输出“50”?这不应该起作用。@TimSchmelter,但是
数字
是一个字符串数组,所以.Max()
使用IComparable.CompareTo()
比较字符串,就像@MatthewWatson说的那样-想象一下从A-Z排序字符。Z将是排序顺序的最后一个,Z将是.Max()的结果关于这个collection@kame-你是对的,我已经添加了一个答案,解释了为什么“0”
的字母顺序比“-”
小。他的问题是,如果那些是字符串而不是数字,为什么你可以使用Min/Max
。@TimSchmelter你说得对。我补充了解释。谢谢。在一个示例中,-
低于0
,因此这不能解释这一点。但是,OP没有使用字符U00AD。他用的是减号/普通连字符。U002D-和“动物”。比较(“动物”)
返回-1
而不是0
@MatthewWatson-谢谢,我没有检查,因为文档让我相信在他们的示例中是相等的。我只是想在OP的字符和可忽略字符集之间找到一个明确的联系。这或多或少是正确的答案,因为它发生的原因是,“-”被String.CompareTo()
特别处理。