【问题标题】:convert foreach loop to linq将 foreach 循环转换为 linq
【发布时间】:2016-02-02 12:37:38
【问题描述】:
  1. 问题

我想将 foreach 循环转换为 linq 语句。

  1. 细节

我有以下统一类(来自元数据,删除了大部分功能)

public class Transform : Component, IEnumerable
{
    public IEnumerator GetEnumerator();
}

我自己的类中有这个类的一个局部变量(继承),就是

Transform transform;

我可以做到这一点

List<Transform> children = new List<Transform>();
foreach (Transform t in transform)
    children.Add(t);

如何在 Linq 表达式中做同样的事情?

【问题讨论】:

  • 如果您希望我们理解您的问题,请避免使用var
  • children = transform.Cast&lt;Transform&gt;().ToList(); 适合你吗?
  • 我认为var 读起来更好。
  • @HimBromBeere 他指的是 OP
  • Linq 很好地使代码简单易读,Unity 也建议尽可能避免它并使用您自己的代码。 "– “Linq” — 检查创建和丢弃 Linq 查询所浪费的时间;考虑用手动优化的方法替换热点。"

标签: c# linq unity3d foreach


【解决方案1】:

它必须是 IEnumerable&lt;T&gt; 才能访问 LINQ 表达式。

IEnumerable 转换为IEnumerable&lt;T&gt; 的一种方法是使用OfType&lt;T&gt;Cast&lt;T&gt; 扩展方法(如果您知道类型)。

例如

List<Transform> transforms = transform.Cast<Transform>().ToList();

另见Does LINQ work with IEnumerable

【讨论】:

  • 谢谢!我刚刚做了我的 10k 代表。嗬嗬! :)
【解决方案2】:

如果Transform 没有实现IEnumerable&lt;Transform&gt;,你可以使用Enumerable.Cast

List<Transform> children = transform.Cast<Transform>().ToList(); 

否则很简单:

List<Transform> children = transform.ToList(); 

【讨论】:

  • 问题不是Transform是否实现了接口,而是transform-list是否实现了。
  • 您编辑了吗?我觉得以前有点不同。无论如何,我将从您的答案中获得的解决方案放在原始帖子中以获得良好的格式。谢谢!
  • @AndreasReiff:不,第一个版本。等待几秒钟后我添加了 " if Transform 没有实现 IEnumerable"
猜你喜欢
  • 2014-03-16
  • 2014-03-12
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多