我一直在试图重写LINQ中的一些命令式代码,直到我意识到我错过了什么。但我不知道为什么这是一个问题。考虑以下。测试失败运行Test.Test2(testList)
与linq过滤器在默认情况下不能出现?
序列中没有匹配的元素
在过去,我曾治疗过这些形式可以互换,通过推我的谓词的First
,Single
等编写代码较小..条款。很明显,当涉及DeafultIfEmpty
时,我不能这么做。这是因为使用Where
和First
,Single
等是不可互换的吗?或者,是因为DefaultIfEmpty
条款引入了复杂性?
编辑1 我添加了一个测试,显示FirstOrDefault不起作用。它失败,“未找到”不等于(空)。
public static class Test
{
public static string Test1(params string[] input)
{
return input
.Where(x => x == "apples")
.DefaultIfEmpty("bannanas")
.First();
}
public static string Test2(params string[] input)
{
return input
.DefaultIfEmpty("bannanas")
.First(x => x == "apples");
}
public static string Test3(params string[] input)
{
return input
.DefaultIfEmpty("bannanas")
.FirstOrDefault(x => x == "apples");
}
}
public class TestStuff
{
[Fact]
public static void TestOneAndTwo()
{
var testList = new string[] { "oranges", "pears", "pineapples" };
var one = Test.Test1(testList);
var two = Test.Test2(testList);
Assert.Equal(one, two);
}
[Fact]
public static void TestOneAndThree()
{
var testList = new string[] { "oranges", "pears", "pineapples" };
var one = Test.Test1(testList);
var three = Test.Test3(testList);
Assert.Equal(one, three);
}
}
这对我来说很有意义,我没有考虑过操作顺序的重要性......并且我认为DefaultIfEmpty为后面的操作员设置了一个默认值,如果它们什么都不返回的话。它的行为如你所描述的那样。 – cocogorilla