我有一个名为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
?
答案 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
调用中,因为为什么不这样做?)
是的,其他答案也可以,但是我的口味还有些“机制”,而不是仅仅声明我们想要的东西。