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ブログ記事もお読みになることをお勧めします。この記事では、ステートメントと表現の哲学的な違いについて説明しています。

本当に必要な場合は、イベント サブスクリプションの後にステートメント本体と return ステートメントを含むラムダ式を使用することで、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 に答える