C#Max还是默认?

use*_*301 0 c# collections functional-programming

如何在C#中为空集合使用默认值IEnumerable.Max?

这是我想在Java 8中做的事情:

public static void doTest(List<String> l) {
    System.out.println("max string is: " + l.stream().max((a, b) -> a.compareToIgnoreCase(b)).orElse("default"));
    System.out.println("max length is: " + l.stream().mapToInt(s -> s.length()).max().orElse(-1));
}

public static void main(String[] args) throws Exception {
    System.out.println("Test with non-empty list");
    doTest(Arrays.asList("alpha", "beta", "charlie", "gamma"));

    System.out.println("");

    System.out.println("Test with empty list");
    doTest(Arrays.asList());
}
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止在C#中所拥有的:

static void DoTest(List<String> l) {
    Console.WriteLine("max string is: " + l.Max());
    Console.WriteLine("max length is: " + l.Select(s => s.Length).Max());
}

static void Main() {
    Console.WriteLine("Test with non-empty list");
    DoTest(new List<String> { "alpha", "beta", "charlie", "gamma" });

    Console.WriteLine("");

    Console.WriteLine("Test with empty list");
    DoTest(new List<String> { });
}       
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

我只是用DefaultIfEmpty:

int maxLength = l.Select(s => s.Length).DefaultIfEmpty().Max();
Run Code Online (Sandbox Code Playgroud)

或者指定默认值:

int maxLength = l.Select(s => s.Length).DefaultIfEmpty(-1).Max();
Run Code Online (Sandbox Code Playgroud)

或者使用可以为空的值,以便您可以分辨出不同的值:

int? maxLength = l.Select(s => (int?) s.Length).Max();
Run Code Online (Sandbox Code Playgroud)

然后,maxLength将是null,如果l是空的.