据我所知,在LINQ中,方法FirstOrDefault()可以返回非NULL的Default值.我还没有弄清楚的是,当查询结果中没有项时,这个(和类似的)方法可以返回NULL以外的哪些东西.有没有什么特殊的方法可以将其设置为,如果特定查询没有值,则返回某个预定义的值作为默认值?

推荐答案

一般情况,不仅仅是值类型:

static class ExtensionsThatWillAppearOnEverything
{
    public static T IfDefaultGiveMe<T>(this T value, T alternate)
    {
        if (value.Equals(default(T))) return alternate;
        return value;
    }
}

var result = query.FirstOrDefault().IfDefaultGiveMe(otherDefaultValue);

同样,这无法真正判断序列中是否有was个值,或者第一个值是否为默认值.

如果你关心这件事,你可以这样做

static class ExtensionsThatWillAppearOnIEnumerables
{
    public static T FirstOr<T>(this IEnumerable<T> source, T alternate)
    {
        foreach(T t in source)
            return t;
        return alternate;
    }
}

并用作

var result = query.FirstOr(otherDefaultValue);

尽管正如斯蒂克先生指出的那样,这项工作在.DefaultIfEmpty(...).First()年前也可以完成.

.net相关问答推荐

Npgsql Minimum Pool Size 似乎没有被考虑在内

为什么 .net 对字符串使用 UTF16 编码,但默认使用 UTF-8 来保存文件?

在生产中使用实体框架(代码优先)迁移

在 C# 中将字节数组保存为磁盘上的文件的最有效方法是什么?

有什么方法可以使用 .NET 应用程序使用 git 吗?

mstest.exe 在哪里?

如何 Select 数据表中列的最小值和最大值?

为什么 .NET 中没有可序列化 XML 的字典?

SubscribeOn 和 ObserveOn 有什么区别

如何使用转储文件来诊断内存泄漏?

属性应该与其类型同名吗?

是否有可用的 WPF 备忘单?

形成两个列表并集的最简单方法

在 .NET 中计算目录大小的最佳方法是什么?

如何在 Action 中传递参数?

如何知道 DateTime 是否在 C# 中的 DateRange 之间

使用+运算符的字符串连接

.NET 委托类型的正确命名约定?

如何将 .NET 应用程序编译为本机代码?

如何使用 AutoMapper .ForMember?