我一直在試圖重寫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