【问题标题】:Checking is there any same type object inside of the object list? [duplicate]检查对象列表中是否有任何相同类型的对象? [复制]
【发布时间】:2020-09-13 11:00:04
【问题描述】:

我有一个从 A 类型派生的对象列表(X 和 Y 派生自 A)

List<A> list = new List<A>()
{
   new X(),
   new Y(),
};

我有一个从 A 类型派生的对象。 Z 对象

我想检查类型相等性是否在列表对象类型中存在与 Z 对象相同的类型 这样的代码怎么写?

【问题讨论】:

  • 所以 X,Y,Z 是从 A 派生的?你想检查一个 Z 对象是否在 A 列表中?
  • Z类型是编译时固定的还是运行时动态确定的?
  • 还有一个问题:类型必须完全匹配还是派生类型可以吗?示例:如果列表包含一个从 Z 派生的 ZZ 类型的对象,它是否匹配?
  • @KlausGütter 可以在运行时确定。顺便说一句,我的对象类型不支持任何接口,如 IEnumerable 等。
  • @KlausGütter 我的类型是否必须完全匹配-->是的。

标签: c# list object types equality


【解决方案1】:

你可以简单地写成建议的副本:

bool containsOfTypeZ = list.OfType<Z>().Any();

或如@KlausGütter 所想:

var someType = someInstance.GetType();
bool containsOfSomeRuntimeType = list.Any(o => o.GetType() == someType);

【讨论】:

  • FirstOrDefault() != null可以简化为Any()
  • 无需使用 where 或 Z 类型的实例,您可以简单地使用类似此 list.Any(x => x.GetType() == typeof(Z)) 的 linq ;
  • list.Any(a =&gt; a is Z),如果您也需要找到从Z派生的任何内容,这将有所帮助。
  • 顺便说一下,我的对象类型不支持任何接口,例如 IEnumerable 等
  • @thepasserby 没关系...我们对List&lt;&gt; 实例采取行动。 Z 可以是任何class 类型,甚至是structenumdelegate 等。因此Linq 扩展方法作用于IEnumerable&lt;Z&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 2019-03-15
  • 2022-08-22
  • 2012-12-24
  • 2021-02-02
  • 2020-07-09
相关资源
最近更新 更多