Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用Linq求负数数列的最小值_C#_Linq_Numbers_Range_Minimum - Fatal编程技术网

C# 用Linq求负数数列的最小值

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

下面的代码没有给出预期的最小值-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.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用于比较

此行为有两个原因:

  • 您正在对字符串而不是数字进行排序。这意味着Linq在幕后使用
    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()
    特别处理。