Linq .SingleOrDefault - 如何设置自定义类的默认值?

Dem*_*tic 11 c# linq

我回答了一些问题并搜索了谷歌,但我找不到答案(这让我很满意).

基本上,我理解SingleOrDefault返回null或0(取决于类型).

但我怎么能让它返回其他东西呢?

return myChannels.All.Where(_Channel => _Channel.Guid == this.ParentChannelGuid).SingleOrDefault(_SPECIFICCHANNEL);

所以,我希望_SPECIFICCHANNEL在它不是单身的情况下归还..可以做到吗?

Osk*_*lin 9

您必须制作扩展方法:

    public static T SingleOr<T>(this IEnumerable<T> list, T defaultValue) where T : class
    {
        return list.SingleOrDefault() ?? defaultValue;
    }
Run Code Online (Sandbox Code Playgroud)

没有其他办法.所有类都默认为null.

  • @Allon 如果您不编写其他方法,这是默认设置 (2认同)

ipr*_*101 5

你可以使用DefaultIfEmpty()(psedo代码如下) -

return myChannels.All.Where(_Channel => _Channel.Guid == this.ParentChannelGuid).DefaultIfEmpty(_SPECIFICCHANNEL).SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)


All*_*nek 5

这可以以相当简单的方式完成.如果您创建自己的扩展方法比泛型更具体SingleOrDefault,那么编译器将更喜欢更具特定类型的版本.下面是一个示例,说明如何使用简单的Person类(您可以将其复制粘贴到LINQPad中以快速查看结果):

public class Person
{
    public string Name { get; set; }

    public override string ToString()
    {
        return Name ?? "";
    }
}

public static class PersonExtensionMethod
{
    public static Person SingleOrDefault(this IEnumerable<Person> source)
    {
        var person = Enumerable.SingleOrDefault(source);

        if (person == null)
            return new Person { Name = "Unnamed" };

        return person;
    }
}

public static void Main()
{
    var emptyCollection = new Person[0];
    var nonEmptyCollection = new Person[] { new Person { Name = "Jack" } };

    Debug.WriteLine("Empty collection: " + emptyCollection.SingleOrDefault());
    Debug.WriteLine("Non-empty collection: " + nonEmptyCollection.SingleOrDefault());
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,SingleOrDefault(IEnumerable<Person>)优先于SingleOrDefault<T>(IEnumerable<T>)哪个不太具体.

  • 在我看来,改变默认.net方法的行为并不是一个好主意.如果有人打电话给SingleOrDefault而不知道你写了这个扩展名,那么很可能会发现很难找到错误 (3认同)