如何制作默认值(TSource)

时间:2011-06-21 01:42:45

标签: c# .net linq c#-4.0 default

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

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

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

2 个答案:

答案 0 :(得分:7)

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会抛出。

答案 1 :(得分:3)

如果没有元素,你需要定义你想要返回的“东西”:

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

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