如何制作默认值(TSource)

Pet*_*ter 2 .net c# linq default c#-4.0

在Linq当我调用SingleOrDefault或FirstOrDefault时,如何为特定对象返回除null之外的其他内容,例如.

        List<CrazyControls> cc = CrazyControlRepository.All();
        cc.SingleOrDefault(p => p.Id == id).Render();
Run Code Online (Sandbox Code Playgroud)

如何让我的CrazyControls返回一个实现基本Render()方法的默认实例?

Jon*_*Jon 7

随着DefaultIfEmpty(defaultValue).这将确保如果集合为空,则将使用该类型的默认实例填充该集合.

所以你可以这样做:

var defaultValue = new CrazyControl(...);

List<CrazyControls> cc = CrazyControlRepository.All();
cc.Where(p => p.Id == id).DefaultIfEmpty(defaultValue).First().Render();
Run Code Online (Sandbox Code Playgroud)

查询表达式需要更改一点.新的工作原理如下:

  1. 根据现有标准过滤集合.这将在过滤的序列中留下一个或没有项目.
  2. 用于DefaultIfEmpty确保序列中只包含一个项目(如果已经有一个项目,DefaultIfEmpty将不执行任何操作).
  3. 使用First以获得单个项目.我没有使用的原因Single是,如果谓词不同(或者将来会发生变化)并且它接受了多个项目,Single那么就会抛出.