2016-06-07 16 views
0

想象我這樣做:使用Linq,var和FirstOrDefault()時檢查默認值?

var player = players.FirstOrDefault(); 

或任何複雜的LINQ表達式,其中的最後一個函數運行是FirstOrDefault

執行後,player可以default()。如何在保留var樣式類型聲明的情況下檢查此問題?它甚至可能在C#中?

1.

if (player == default(Player)) 

的明確Player使得var player覺得自己很沒用。我不如使用Player player = ...而不是var player ...,這裏的整個問題是如何保持var左右。

2.

if (player == default(typeof(player))) 

不是編譯。我可以做typeof(Player),但看到上面的感覺毫無意義。

3.

if (player == null) 

作爲default(any reference type)null。但是,如果Player類是struct類型,顯然這是不正確的。

我知道,我可以檢查數組的大小,然後做.First()甚至.DefaultIfEmpty(something),但使.FirstOrDefault()毫無意義,並在.DefaultIfEmpty情況下,要求您知道類的類型,不服從var該問題的侷限性。

有沒有什麼辦法可以使用var來編寫這段代碼,對於所有類型都可以正常工作var可以站在這裏嗎?

+0

爲什麼它在第1點「保持變化」這麼重要? –

+0

所有要點都很重要:)我只是想知道是否可以將類型名稱保留在此表達式之外,並且仍然檢查默認值。 – Pod

回答

2

你可以寫一個擴展方法:

public static class Extensions 
{ 
    public static bool IsDefault<T>(this T source) 
    { 
     return EqualityComparer<T>.Default.Equals(source, default(T)); 
    } 
} 

然後用:

var player = players.FirstOrDefault(); 
if (player.IsDefault()) 
{ 
    // 
} 
+0

問完問題後,我清洗了一下,其實我想起了類似的東西。你的版本有使用EqualityComparer來避免像我的那樣調用sources.equals的附加'好處'。你寫這個只是爲了答案,還是你已經有的東西? – Pod

2

可以是null0default(TheTypeGoesHere)

只有當var允許你做某件你不能沒有的事情時,它就是匿名類型,因爲它們總是引用類型,所以在這種情況下可以使用null

+0

嘗試使用結構體或int列表來完成它。 – Vlad

+0

@Vlad試圖做一個結構或int列表?對於結構,我們顯然使用第三個答案,並且爲第一個或第三個(意味着同一件事)的int列表。 –

1

如果你有收藏想要得到的默認值,而不必指定你可以做一些喜歡的類型:

if(player == players.Take(0).SingleOrDefault()) 

if(player == players.SingleOrDefault(o => false)) 
+0

好主意:)雖然我接受了擴展方法的想法,因爲它提供了更多的可讀性。 – Pod