【问题标题】:Expression bodied member equivalent表达式主体成员等效项
【发布时间】:2021-08-17 11:02:02
【问题描述】:

我只是在学习类属性的表达式主体成员,基础知识很简单,但我试图确定以下 getter 是否甚至可以写为表达式主体成员 - 不是为了提高性能或任何东西,只是作为一个学习练习:

public static List<Block> AllBlocks
{
    get
    {
        List<Block> allBlocks = new List<Block>(goalBlocks.Count +
                                pathBlocks.Count +
                                boardBlocks.Count);
        allBlocks.AddRange(goalBlocks);
        allBlocks.AddRange(pathBlocks);
        allBlocks.AddRange(boardBlocks);

        return allBlocks;
    }
}

据我所知,它不能,因为它声明了一个新变量。我已经尝试了几种像其他 FBM 属性一样编写它的方法,甚至尝试用与 Parallel.ForParallel.ForEach 循环相似的样式编写它,我没想到会工作,但我想我会试一试的。

【问题讨论】:

  • 好吧,你可以使用new[] { goalBlocks, pathBlocks, boardBlocks}.SelectMany(x =&gt; x).ToList() 来达到同样的效果,但效率略低...
  • 存在数据依赖,所以不要使用任何并行处理。它只会增加不必要的开销。
  • @JHBonarius - 谢谢。我实际上并没有使用并行处理,只是解释了我试图为 getter 模仿的一种样式。

标签: c# c#-8.0 expression-bodied-members


【解决方案1】:

您可以不再在 getter 中声明一个新列表,而是将其重写为一个简单的联合表达式:

public static List<Block> AllBlocks =>
  goalBlocks.Union(pathBlocks).Union(boardBlocks).ToList();

或者,如果您不明确需要列表:

public static IEnumerable<Block> AllBlocks =>
  goalBlocks.Union(pathBlocks).Union(boardBlocks);

如下所述,.Union() 将删除重复项。如果您不打算发生这种情况,则可以改用.Concat()

public static IEnumerable<Block> AllBlocks =>
  goalBlocks.Concat(pathBlocks).Concat(boardBlocks);

【讨论】:

  • 我会使用 Concat... 但问题是他/她/他们是否可以或想要使用 Linq..
  • 我认为您的意思是使用.ConcatUnion 将删除重复项,因此不等同于示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
相关资源
最近更新 更多