使用Linq,var和FirstOrDefault()时检查默认值?

时间:2016-06-07 18:07:52

标签: c# linq

想象一下我这样做:

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可以代表的所有类型吗?

3 个答案:

答案 0 :(得分:2)

null0default(TheTypeGoesHere)

var允许您执行某项操作的唯一时间是不能使用匿名类型,并且由于它们始终是引用类型,因此在这种情况下您可以使用null。< / p>

答案 1 :(得分: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())
{
    //
}

答案 2 :(得分:1)

如果你有一个集合想要获得默认值而不必指定类型,你可以做类似的事情:

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

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