31

私は多くのことを試しましたが、私にとって最も論理的なものはこれのようです:

int divisor = AllMyControls.Take(p => p.IsActiveUserControlChecked).Count();

AllMyControlsのコレクションですUserControls。私が知りたいのUserControlsは、IsActiveUserControlCheckedプロパティが true に設定されている数です。

VSで得られるものは次のとおりです。

Cannot convert lambda expression to type 'int' because it is not a delegate type

私の表現の何が問題になっていますか?

4

5 に答える 5

67
int divisor = AllMyControls.Where(p => p.IsActiveUserControlChecked).Count()

または単に

int divisor = AllMyControls.Count(p => p.IsActiveUserControlChecked);

Enumerableあなたは初心者なので、ドキュメントを見てみる価値があります

于 2013-06-21T20:47:23.740 に答える
7

なぜ直接使用しないのCountですか?その== trueステートメントも非常に冗長です。

int divisor = AllMyControls.Count(p => p.IsActiveUserControlChecked);

また、 Takeメソッドが を待機しているため、エラーが発生していますint。取得したいコレクションの先頭から連続する要素数を指定する必要があり、ラムダ式を入れることはできません。そのためには、 TakeWhileを使用する必要があります。そう

int divisor = AllMyControls.TakeWhile(p => p.IsActiveUserControlChecked == true).Count();

正しいはずですが、期待どおりには機能しません。状態が壊れると停止します。したがって、AllMyControls に が含まれている場合true, true, false, trueTakeWhilewithCountは予想される 3 ではなく 2 を返します。

于 2013-06-21T20:49:33.247 に答える
1

キスしないで

int divisor = AllMyControls.Count(p => p.IsActiveUserControlChecked);
于 2013-06-21T20:49:11.207 に答える
1

のパラメーターがTake必要intであり、デリゲート/ラムダ式を渡しています。Take は最初countの要素だけを取得するように設計されています。

メソッドを使用Countしてデリゲートを渡して、その条件に適合する要素をカウントできます。このようにして、IEnumerable を 1 回だけ繰り返します。最初に基準に合わないものを選別してから、実際にそれらをカウントするのではありません。

AllMyControls.Count(p => p.IsActiveUserControlChecked);
于 2013-06-21T20:56:27.550 に答える
0

試す

int divisor = AllMyControls.Where(x => x.IsActiveUserControlChecked == true).Count();
于 2013-06-21T20:47:56.957 に答える