3

我正在使用以下语句。

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的构造函数中。

  1. 可能吗?
  2. 推荐吗?
  3. 应用广泛吗?
4

6 回答 6

4

您应该使用您现在正在使用的代码。从可用性的角度来看, AWhere和 aSelect好得多,然后 aSelect有时将项目映射到null(或其他一些“非真实项目”占位符),而这些项目原本不应该存在。您只需要摆脱或忽略那些在路上的空项目。

你在做两件事;将项目过滤到满足条件的项目,然后将每个项目映射到另一种类型的项目。您的代码应该反映您正在做这两件事的事实。

于 2013-01-14T19:14:52.653 回答
1

不,除了从 new 构造的对象之外,不可能返回任何东西。您可以从构造函数中抛出,从而阻止创建特定对象,但必须处理此类异常。

我不建议在创建对象时尝试阻止构造/销毁对象 - 通常预期对象的构造会成功。不按照其他答案中的建议调用构造函数是更清洁的方法。

于 2013-01-14T19:19:15.547 回答
0

可能吗?

对的,这是可能的。但需要条件验证(Where 子句将转换为 Select 子句)

推荐吗?

我不能推荐或不推荐。但从代码审查的角度来看,它看起来有问题和狡猾。

应用广泛吗?

未见广泛应用。空对象模式更为人所知。

于 2013-01-14T19:17:12.740 回答
0
  1. 是的。
  2. No'ish(取决于一些额外的超超特殊情况,这可能是最好的方法)。
  3. 没见过。不过,很酷的想法。
于 2013-01-14T19:18:55.890 回答
0

既然你问了,请注意new Nullable<int>()返回null

但我想重复一下 Servy 所说的 - 你当前的代码很好。不要过度复杂化!

于 2013-01-14T19:59:36.353 回答
-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))
于 2013-01-14T19:20:22.893 回答