我正在使用以下声明。
IEnumerable<Stuff> output = list.Entities.Select(
element => new Stuff(element));
有时元素是不需要包含它的,所以我添加了一个条件。
IEnumerable<Stuff> output = list.Entities.Where(
element => IsDecent(element)).Select(
element => new Stuff(element));
现在,它只是打击我,它可能更整洁地跳过检查器并导致创建新的 Stuff 以产生nada(返回 null 或不返回什么都没有),因此省略了不雅元素的添加。或者也许在满足这样的条件时自动调用析构函数。当然,检查需要在其他地方执行,即在 Stuff 的构造函数中执行。
答案 0 :(得分:4)
您应该使用您现在使用的代码。从可用性的角度来看,Where
和Select
很多更好,然后Select
有时将项目映射到null
(或其他一些) “不是真正的项目”占位符,当他们不应该首先在那里。你只需要在路上摆脱或忽略这些空项目。
答案 1 :(得分:1)
不,除了new之外的构造对象,不可能返回任何东西。您可以从构造函数中抛出,从而阻止创建特定对象,但是必须处理此类异常。
我不建议在创建对象时阻止构造/销毁对象 - 通常构建对象应该会成功。不像其他答案中建议的那样调用构造函数是更清晰的方法。
答案 2 :(得分:0)
有可能吗?
是的,这是可能的。但是需要条件验证(Where子句将转移到Select子句)
是否推荐?
我无法推荐或不推荐。但从代码审查的角度来看,它看起来很麻烦和狡猾。
它被广泛应用吗?
未见广泛应用。 Null object pattern更为人所知。
答案 3 :(得分:0)
答案 4 :(得分:0)
您提问,请注意new Nullable<int>()
返回null
。
但我想重复what Servy said - 您当前的代码很好。不要过于复杂!
答案 5 :(得分:-1)
我认为你所拥有的可能是最好的。但是如果你开始组合它们,你可以使用这样的扩展方法:
static class Extensions {
public static IEnumerable<U> SelectWhere<T, U>(
this IEnumerable<T> @this,
Predicate<T> filter,
Func<T, U> map)
{
foreach (T element in @this) {
if (filter(element)) yield return map(element);
}
}
}
你会这样使用它:
list.Entities.SelectWhere(IsDecent, element => new Stuff(element))