C# 如何从列表中获取特定项目<;对象>;当所有对象都是不同类型的EventArgs时

C# 如何从列表中获取特定项目<;对象>;当所有对象都是不同类型的EventArgs时,c#,linq,C#,Linq,我有一个名为eventQueue的对象列表,其中存储了在后台执行的任务产生的所有事件。现在,我需要处理这个列表,从中提取特定事件。我想使用LINQ主要是为了代码可读性(我不想编写多个foreach),我的问题是我不知道如何继续。假设我有一个名为FirstEventArgs的自定义EventArgs的多个实例,我想从列表中提取一个特定的实例,并编写一个foreach foreach(object o in eventQueue) { if( o is FirstEventArgs) {

我有一个名为
eventQueue
的对象列表,其中存储了在后台执行的任务产生的所有事件。现在,我需要处理这个列表,从中提取特定事件。我想使用LINQ主要是为了代码可读性(我不想编写多个foreach),我的问题是我不知道如何继续。假设我有一个名为
FirstEventArgs
的自定义
EventArgs
的多个实例,我想从列表中提取一个特定的实例,并编写一个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;

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

您可以使用
&&
运算符,然后强制转换为所需的类型。AND语句的后半部分将仅在前半部分为true时进行计算,因此不会从强制转换中得到任何错误。这就是所谓的短路评估,根据这个答案()可以在C#中依赖


您可以使用
&&
运算符,然后强制转换为所需的类型。AND语句的后半部分将仅在前半部分为true时进行计算,因此不会从强制转换中得到任何错误。这就是所谓的短路评估,根据这个答案()可以在C#中依赖


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

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

感谢@Slappywag检查它是否工作

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

FirstEventArgs ev = eventQueue.Where(x => x is FirstEventArgs fea && fea.MyProperty == desiredValue)
                              .SingleOrDefault() as FirstEventArgs;
感谢@Slappywag检查它是否工作

允许您进行类型测试,并免费加入演员阵容:

FirstEventArgs ev = eventQueue
                     .OfType<FirstEventArgs>()
                     .SingleOrDefault(fea=>fea.MyProperty==desiredValue);
FirstEventArgs ev=eventQueue
第()类
.SingleOrDefault(fea=>fea.MyProperty==desiredValue);
(我还将剩下的过滤移到了
SingleOrDefault
调用中,因为,为什么不呢?)

是的,其他答案也很有效,但是对于我的口味来说,仍然有太多的“机制”,而不是仅仅声明我们想要什么。

让你做一个类型测试并免费加入演员阵容:

FirstEventArgs ev = eventQueue
                     .OfType<FirstEventArgs>()
                     .SingleOrDefault(fea=>fea.MyProperty==desiredValue);
FirstEventArgs ev=eventQueue
第()类
.SingleOrDefault(fea=>fea.MyProperty==desiredValue);
(我还将剩下的过滤移到了
SingleOrDefault
调用中,因为,为什么不呢?)


是的,其他答案也可以,但是对于我的口味来说,仍然有太多的“机制”,而不仅仅是声明我们想要什么。

模式匹配在LINQ查询中起作用吗,例如,
eventQueue。其中(x=>x是FirstEventArgs fea&&fea.MyProperty==desiredValue)
?@mmathis我刚刚检查过它-是的,请随意添加它作为答案。它比我的好:)我很接近。我做错的是&(FirstEventArgs)x.MyProperty==desiredValue,而不是&(FirstEventArgs)x.MyProperty==desiredValue。感谢您在LINQ查询中执行模式匹配工作,例如,
eventQueue.Where(x=>x是FirstEventArgs fea&&fea.MyProperty==desiredValue)
?@mmathis我刚刚检查过它-是的,可以添加它作为答案。它比我的好:)我很接近。我做错的是&(FirstEventArgs)x.MyProperty==desiredValue,而不是&(FirstEventArgs)x.MyProperty==desiredValue。谢谢你这很好。我不知道你会做这样的事。我会把被接受的答案留给另一个人,因为他更快,但是你的答案更容易理解,这很简洁。我不知道你会做这样的事。我会把公认的答案留给另一个人,因为他更快,但你的答案更易读