我回答了一些问题并搜索了谷歌,但我找不到答案(这让我很满意).
基本上,我理解SingleOrDefault
返回null或0(取决于类型).
但我怎么能让它返回其他东西呢?
return myChannels.All.Where(_Channel => _Channel.Guid == this.ParentChannelGuid).SingleOrDefault(_SPECIFICCHANNEL);
所以,我希望_SPECIFICCHANNEL
在它不是单身的情况下归还..可以做到吗?
您必须制作扩展方法:
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.
你可以使用DefaultIfEmpty()(psedo代码如下) -
return myChannels.All.Where(_Channel => _Channel.Guid == this.ParentChannelGuid).DefaultIfEmpty(_SPECIFICCHANNEL).SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)
这可以以相当简单的方式完成.如果您创建自己的扩展方法比泛型更具体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>)
哪个不太具体.
归档时间: |
|
查看次数: |
8031 次 |
最近记录: |