【问题标题】:C# - Iterate through given type elements inside a List<T>C# - 遍历 List<T> 中的给定类型元素
【发布时间】:2010-12-31 09:18:37
【问题描述】:

我有一个抽象类(Object2D),以及几个继承 Object2D 的类(例如 DisplayObject2D)

我使用 List 来存储对这些对象的所有引用。

我想遍历此列表中的每个 DisplayObject2D。

到目前为止,以下代码正在运行,但是对于 C# 开发来说是新手,我想知道是否有更好的做法:

List<Object2D> tmp = objects.FindAll( delegate( Object2D obj )
                                      { return obj is DisplayObject2D; } );
foreach( DisplayObject2D obj in tmp )
{
   ...
}

提前致谢!

【问题讨论】:

  • @ZedK:+1 好问题:与我现在正在做的事情有关。我很确定你意识到你可以直接在 foreach 循环中使用 George 的答案,但我会提到它,以防万一: foreach(Object2D obj in objects.OfType()) { ... } : of当然,您可能有其他原因将过滤后的对象保留在 'tmp 中,因此您可能不想“触发并忘记”按类型过滤的结果。
  • 是的,这就是我刚刚所做的(​​在添加了缺少的“using System.Linq”语句之后),一切都在一行中完成,非常完美。谢谢!

标签: c# list types


【解决方案1】:
var objects2d = objects.OfType<DisplayObject2D>();

如果你想要一个 IEnumerable

var listOfObjects2d = objects2d.ToList();

如果你想要一个列表

注意 OfType 会给你一个更具体的类型

IEnumerable<DisplayObject2D>

如果不是您所期望的,请使用 Cast 扩展将其转换回可枚举的基本类型。

var listOfObjects2dFilteredByMoreSpecificType = 
 objects.OfType<DisplayObject2D>.Cast<Object2D>()
//.ToList() // until you really need an IList<T> better leave it just an enumerable
;

【讨论】:

  • @George +1,谢谢;你的回答解决了我在使用 'OfType 时遇到的问题......我最后省略了空括号。
  • 其实“objects”是一个List,而且貌似这个OfType方法不存在(自动补全窗口中没有出现)=/我一直在找MSDN中的“OfType”,但我并没有真正理解如何使用它。
  • 要使用它,您必须声明 using System.Linq 命名空间和对 System.Core dll 的引用。
  • 现在它工作得很好,而且真的很容易使用!非常感谢你的帮助 ! =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多