SingleOrDefault返回null时的LINQ新实例

r3p*_*ica 12 c# linq asp.net

另一个快速问题.我有这个简单的方法:

    #region Fields

    private Collection<Address> _addresses;

    #endregion

    #region Public methods

    public Address DeliveryAddress()
    {
        if (_addresses == null)
            if (this.Id > 0)
                _addresses = Core.Data.Addresses.GetClient(this.Id);

        return _addresses.SingleOrDefault(x => x.TypeId == AddressType.Delivery);
    }

    public Address InvoiceAddress()
    {
        if (_addresses == null)
            if (this.Id > 0)
                _addresses = Core.Data.Addresses.GetClient(this.Id);

        return _addresses.SingleOrDefault(x => x.TypeId == AddressType.Invoice);
    }

    #endregion
Run Code Online (Sandbox Code Playgroud)

正如你可以看到我试图返回的一个结果DeliveryAddress,并为一个结果InvoiceAddress.我的问题是我希望链接表达式创建Address()if SingleOrDefault返回的新实例null.我对linq很新,所以我不确定SingleOrDefault我应该使用的是正确的表达式.

Tim*_*ter 27

您可以使用DefaultIfEmpty该实例作为默认值:

return _addresses.Where(x => x.TypeId == AddressType.Delivery)
                 .DefaultIfEmpty(new Adress())
                 .Single();
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,您也可以使用`Single`而不是`SingleOrDefault` (3认同)

Oli*_*bes 13

使用null-coalescing运算符:

return _addresses
    .SingleOrDefault(x => x.TypeId == AddressType.Delivery) ?? new Address();
Run Code Online (Sandbox Code Playgroud)

表达方式

x ?? y
Run Code Online (Sandbox Code Playgroud)

否则,x如果x不是null,则收益率y.您可以链接运营商

x ?? y ?? z ?? t
Run Code Online (Sandbox Code Playgroud)

这将返回第一个非null值,或者null全部返回值null.


UPDATE

请注意,SingleOrDefault如果序列具有多个元素,则会引发异常.如果您需要序列的第一个元素可能没有或多个元素,请FirstOrDefault改用.