C# 如何设置默认值(TSource)

C# 如何设置默认值(TSource),c#,.net,linq,c#-4.0,default,C#,.net,Linq,C# 4.0,Default,在Linq中,当我调用SingleOrDefault或FirstOrDefault时,如何为特定对象返回null以外的值,例如 List<CrazyControls> cc = CrazyControlRepository.All(); cc.SingleOrDefault(p => p.Id == id).Render(); List cc=CrazyControlRepository.All(); cc.SingleOrDefault(p=

在Linq中,当我调用SingleOrDefault或FirstOrDefault时,如何为特定对象返回null以外的值,例如

        List<CrazyControls> cc = CrazyControlRepository.All();
        cc.SingleOrDefault(p => p.Id == id).Render();
List cc=CrazyControlRepository.All();
cc.SingleOrDefault(p=>p.Id==Id.Render();
如何使CrazyControl返回实现基本Render()方法的默认实例?

With。这将确保如果集合为空,将使用该类型的默认实例填充该集合

因此,您可以:

var defaultValue = new CrazyControl(...);

List<CrazyControls> cc = CrazyControlRepository.All();
cc.Where(p => p.Id == id).DefaultIfEmpty(defaultValue).First().Render();
var defaultValue=新的疯狂控制(…);
List cc=CrazyControlRepository.All();
cc.Where(p=>p.Id==Id).DefaultIfEmpty(defaultValue.First().Render();
查询表达式需要稍作更改。新的工作原理如下:

  • 根据现有条件筛选集合。这将在筛选的序列中留下一个或没有项目
  • 使用
    DefaultIfEmpty
    确保序列只包含一个项目(如果已经有一个项目,
    DefaultIfEmpty
    将不起任何作用)
  • 首先使用
    获取单个项目。我没有使用
    Single
    而不是first的原因是,如果谓词不同(或者将来会更改),并且它接受多个项,
    Single
    将抛出

  • 如果没有元素,则需要定义要返回的“某物”:

    (cc.SingleOrDefault(p => p.Id == id) ?? new CrazyControls()).Render();
    

    换句话说,您需要定义
    默认值

    ,该代码段很奇怪。你要求的是“所有”疯狂控件,但在下一行你说“抛出异常是因为有不止一个控件。”是的……这有点奇怪,但却是合法的。应该只有一个给定id的疯狂控件,如果我想让它爆炸的话。