我有一个类集合,我想添加到集合属性更改事件函数中。
当我尝试使用以下代码的LINQ时:
(from s in StreetsVI select s.PropertyChanged +=
new PropertyChangedEventHandler(Messege)).ToList();
我得到错误:
The type of the expression in the select clause is incorrect. Type inference failed in the call to 'Select'.
LINQ针对查询。当您想对每个对象执行操作时,这不是一个查询——这都是关于副作用的,您应该只使用普通的foreach
循环。LINQ是而不是为在集合上施加副作用而设计的——事实上,副作用与LINQ喜欢的懒惰评估不太匹配。
您应该只使用foreach
循环:
foreach (var s in StreetsVI)
{
s.PropertyChanged += Messege;
}
我还建议你阅读Eric Lippert的foreach
与ForEach
博客文章,该文章讨论了陈述和表达之间的哲学差异。
请注意,如果真的想要,您仍然可以使用LINQ,方法是在事件订阅后使用带有语句体和返回语句的lambda表达式。。。但这将是对LINQ的曲解,以至于我甚至不想把它包括在答案中。即使使用List<T>.ForEach
也将是一个改进。
尝试:
foreach(var s in StreetsVI) {
s.PropertyChanged += new PropertyChangedEventHandler(Messege);
}
或者,由于您正在将其作为一个列表,您可以使用本机.ForEach
方法:
StreetsVI.ToList()
.ForEach(s => s.PropertyChanged += new PropertyChangedEventHandler(Messege));
Select
必须返回一个值。将事件分配给事件处理程序不会返回值。