当所有对象都是不同类型的EventArgs时,如何从List <object>获取特定项

时间:2019-02-14 14:44:49

标签: c# linq

我有一个名为eventQueue的对象列表,其中存储了由在后台执行的任务所产生的所有事件。现在,我需要处理此列表,以从中提取特定事件。我想主要使用LINQ来提高代码的可读性(我不想编写多个foreach),我的问题是我不完全知道该如何进行。假设我有一个名为EventArgs的自定义FirstEventArgs的多个实例,并且我想从列表中提取一个特定实例,做一个我要编写的foreach

foreach(object o in eventQueue)
{
   if( o is FirstEventArgs)
   {
       FirstEventArgs ev = o as FirstEventArgs ;
       if( ev.MyProperty == desiredValue)
       {
          // you got it 
       }
   }
}

目前,我能够在LINQ中编写以下内容

FirstEventArgs ev = eventQueue.Where(x => x.GetType() == typeof(FirstEventArgs )).SingleOrDefault() as FirstEventArgs;

我的问题是。如何修改前一个条件,以在条件x中是否为object类型添加条件ev.MyProperty = desiredValue

3 个答案:

答案 0 :(得分:3)

您可以在LINQ查询中使用模式匹配将对象转换为您的类型:

FirstEventArgs ev = eventQueue.Where(x => x is FirstEventArgs fea && fea.MyProperty == desiredValue)
                              .SingleOrDefault() as FirstEventArgs;

感谢@Slappywag检查它是否有效!

答案 1 :(得分:2)

您可以使用&&运算符,然后将其强制转换为所需的类型。仅当前半部分为true时,才会评估AND语句的后半部分,因此您不会从转换中得到任何错误。这被称为短路评估,根据此答案(Is relying on && short-circuiting safe in .NET?)可以在C#中依赖。

FirstEventArgs ev = eventQueue.Where(x => x.GetType() == typeof(FirstEventArgs) 
                                       && ((FirstEventArgs)x).MyProperty == desiredValue)
                              .SingleOrDefault() as FirstEventArgs;

答案 2 :(得分:2)

OfType可让您进行类型测试并免费抛出强制转换:

FirstEventArgs ev = eventQueue
                     .OfType<FirstEventArgs>()
                     .SingleOrDefault(fea=>fea.MyProperty==desiredValue);

(我还将剩余的过滤条件移到了SingleOrDefault调用中,因为为什么不这样做?)

是的,其他答案也可以,但是我的口味还有些“机制”,而不是仅仅声明我们想要的东西。