如何设置默认值(TSource)

本文关键字:默认值 TSource 何设置 设置 | 更新日期: 2023-09-27 18:00:04

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

        List<CrazyControls> cc = CrazyControlRepository.All();
        cc.SingleOrDefault(p => p.Id == id).Render();

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

如何设置默认值(TSource)

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

所以你可以做:

var defaultValue = new CrazyControl(...);
List<CrazyControls> cc = CrazyControlRepository.All();
cc.Where(p => p.Id == id).DefaultIfEmpty(defaultValue).First().Render();

查询表达式需要更改一点。新的是这样工作的:

  1. 根据现有条件筛选集合。这将在筛选的序列中留下一个项目或不留下任何项目
  2. 使用DefaultIfEmpty确保序列只包含一个项目(如果已经包含一个,DefaultIfEmpty将不执行任何操作)
  3. 使用First获取单个项目。我之所以不使用Single而不是第一个,是因为如果谓词不同(或者将来会发生变化),并且它接受多个项,Single就会抛出

如果没有元素,您需要定义要返回的"某物":

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

换句话说,您需要定义default value