0

我有一个类的集合,我想添加到集合属性更改事件函数中。

当我尝试使用带有此代码的 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'. 
4

4 回答 4

11

LINQ 是针对查询的。当你想对每个对象做某事时,这不是一个查询——这都是关于副作用的,你应该只使用一个正常的foreach循环。LINQ不是为对集合施加副作用而设计的——实际上副作用与 LINQ 所支持的惰性求值效果不佳。

你应该只使用一个foreach循环:

foreach (var s in StreetsVI)
{
    s.PropertyChanged += Messege;
}

我还建议您阅读 Eric Lippert 的foreachvsForEach博客文章,其中讨论了语句和表达式之间的哲学差异。

请注意,如果您真的想要,您仍然可以使用 LINQ,方法是在事件订阅后使用带有语句主体和 return 语句的 lambda 表达式......但这将是 LINQ 的一种变态,以至于我不甚至想将其包含在答案中。即使使用List<T>.ForEach将是一个改进。

于 2013-06-22T19:10:11.300 回答
3

尝试:

foreach(var s in StreetsVI) {
    s.PropertyChanged += new PropertyChangedEventHandler(Messege);
}
于 2013-06-22T19:08:33.723 回答
1

或者,由于您将其列为列表,您可以使用本机.ForEach方法:

StreetsVI.ToList()
    .ForEach(s => s.PropertyChanged += new PropertyChangedEventHandler(Messege));
于 2013-06-22T19:13:23.317 回答
0

Select必须返回一个值。将事件分配给事件处理程序不会返回值。

于 2013-06-22T19:05:14.603 回答