-3
Regex regex = new Regex("^[a-zA-Z0-9,-_ ]{2,12}$");
            return panel1.Controls.OfType<UserControl1>()
.Select(uc => uc.comboBox2).Any(cb => cb.Text == String.Empty);

コードは検証用であるため、これを実装していますが、それがどのように機能し、どこに流れるのかわかりません。この行を理解するのを手伝ってくれる人はいますか?

return panel1.Controls.OfType<UserControl1>()
.Select(uc => uc.comboBox2).Any(cb => cb.Text == String.Empty);
4

4 に答える 4

7

panel1- フォーム上のコントロール-
.controls追加されたコントロールのリストpanel1
.OfType<UserControl1>()- タイプのコントロールのみUserControl1
.Select(uc => uc.combobox2)- combobox2(それぞれのUserControl1(in panel1) の)プロパティ
.Any(cb => cb.Text == String.Empty)- これらのコンボ ボックスのTextプロパティのいずれかが空の文字列である場合、true と評価されます。

したがって、基本的に、コントロールに追加された のプロパティのTextプロパティのいずれかが空の場合は を返し、そうでない場合は を返します。combobox2UserControl1panel1truefalse


についてのいくつかの説明.Select(uc => uc.comboxbox2)

これは、コレクション内の各アイテムを呼び出すと言っていますucucの右側に作成された値を返すたびに=>。その場合はuc.combobox2. それを単一のものにすると想像してみてください。まあ、タイプの変数が得られるでしょうComboBox(私は推測します)。これはSelectメソッドのコンテキスト内にあるため、アイテムごとに行います。それらすべてに対してそれを行うということは、 のコレクションに基づいて、それらのコレクションを取得することを意味しますUserControl1

.Any(cb => cb.Text == String.Empty) メソッドへのパラメータについてAnyは上記と同じですが、「 」の右側の部分がこの場合、または=>に評価されるものであるため、混乱する可能性があります。このメソッドは、コレクション内の各項目 (この場合は a) を true または false に変換するものを期待しています。それらのいずれかが に変換された場合は true を返し、そうでない場合は を返します。truefalseAnyComboBoxtruefalse

于 2013-02-26T16:27:49.603 に答える
5
  • .Select(...)IEnumerable<T>特定のコレクション内のすべてのアイテムを反復し、アイテムが選択されたプロパティまたは任意のオブジェクトである場所として新しいコレクションを射影します。

  • .Any(...)投影されたコレクション内のすべてのアイテムを繰り返し、少なくとも 1 つのアイテムがブール条件を満たすかどうかを確認します。

アップデート:

と の両方Select(...)に、Any(...)入力パラメーターとしてラムダ式があります。C# の場合:

uc => uc.comboBox2 

...と同等です(他のバリエーションがあります):

delegate(UserControl1 uc) { return uc.comboBox2; }

... と:

cb => cb.Text == String.Empty

...は次と同等です:

delegate(ComboBox cb) { return cb.Text == String.Empty }

実際、式ツリーを除いて、ラムダ式は、より機能的なプログラミング構文を使用した単なるデリゲートです。

遅延実行

補足として、コードには重要な点があります。反復されるまでSelect実行されません (リスト、コレクション: 実装するものはすべて)。IEnumerable<T>つまり、 を実行し、 /または case:foreachを呼び出します。.ToList().ToArray().Any(...)

遅延実行の一部であるオブジェクトは、列挙型全体が列挙されたときに無効な状態になる可能性があるため、これは重要です。

コードを使用して良い例を示します。

// First of all we select the combo boxes identifiers:
var selectedItems = panel1.Controls.OfType<UserControl1>()
.Select(uc => uc.comboBox2.ID);

// Then we get the first combobox and we change its identifier:
var firstCombo = panel1.Controls.OfType<UserControl1>().First().comboBox2;
firstCombo.comboBox2.ID = "ChangedID";

// Now we convert the selectedItems to a list with ToList():
List<string> list = selectedItems.ToList();

コンボ ボックス ID のリストの最初の項目には、元の ID または変更された ID を持つ最初のコンボ ボックスがありますか? 答えは:が呼び出さSelect(...)れたときに実行されたので、変更されたものになります!ToList()

于 2013-02-26T16:24:08.457 に答える
4

ラムダには 3 つの部分があります。矢印 " => "、矢印の左側にパラメーター、矢印の右側に式またはブロック。

これらのラムダを使用して匿名メソッドを作成しています。ラムダを使用して式ツリーを作成することもできますが、ここでは説明しません。

Selectへのこのメソッド呼び出しは、各入力を出力に射影します。

//use the expression syntax, which implies that the value of the expression is returned.
// creates an anonymous method.
Select(uc => uc.comboBox2)

これは、ラムダの式によって行われ、入力のコンボボックス 2 プロパティの値にアクセスして返します。このコードは同じことを行います:

//use the block syntax to create an anonymous method.
Select(uc => { return uc.comboBox2; })

ラムダが気に入らない場合は、メソッドのシグネチャが呼び出しているメソッドのパラメーターと一致する限り、定義したメソッドを使用できます。

//define a method yourself.
public ComboBox GetComboBox(UserControl1 uc)
{
  return uc.combobox2;
}

//use that method in the Select call.
Select(GetComboBox)

このメソッド呼び出しAnyは、ソースを列挙し、条件に一致する最初のアイテムが見つかったときに停止し、true を返します。一致する項目が見つからずに最後まで到達した場合は、Anyfalse を返します。

 Any(cb => cb.Text == String.Empty);

ラムダ式は、bool を返す匿名メソッドを生成します。Any はそのメソッドを使用してコンボボックスをチェックします。各コンボボックスは、いずれかが true を返すまでチェックされます。その後、true が によって返されAnyます。true を返すコンボボックスがない場合は、 によって false が返されAnyます。

于 2013-02-26T16:32:10.090 に答える
2

Power Shell を使用したことがありますか? 私がそれを持ち出す理由は、基本的にラムダ式は通常データをパイプするためです。データをパイプするこの方法により、Linq の使用が大幅に高速かつ効率的になります。これにより、特定のクエリ構文をより速く簡単に使用できます。

ラムダ式は、デリゲートまたは式ツリー型を作成するために使用できる無名関数です。ラムダ式を使用すると、引数として渡すことができる、または関数呼び出しの値として返すことができるローカル関数を作成できます。ラムダ式は、LINQ クエリ式を記述するのに特に役立ちます。

ラムダ式を作成するには、入力パラメーター (存在する場合) をラムダ演算子 => の左側に指定し、式またはステートメント ブロックを反対側に置きます。たとえば、ラムダ式 x => x * x は、x という名前のパラメーターを指定し、x の 2 乗の値を返します。次の例に示すように、この式をデリゲート型に割り当てることができます。

delegate int del(int i);
static void Main(string[] args)
{
    del myDelegate = x => x * x;
    int j = myDelegate(5); //j = 25
}

ラムダ式で注意すべきことは、=>演算子です。これは、代入と同じ優先順位を持ち=、右結合です。

Lambda は非常に重要であるため、Microsoft Developer Network には Lambda に関する情報がたくさんあります。ラムダ式に関するもう 1 つの優れたリソースは、O'Reily による C# 5.0 In A Nutshell です

あなたの場合、Lambda は次のように述べています。ユーザー コントロール フィールドのいずれかが null の場合は、true を返します。それ以外の場合は false を返します。正規表現とラムダ式を使用してフィールドをエラー チェックするのは効率的な方法です。

また、@George Duckett は、コードの意味についてより具体的な詳細を説明しています。

于 2013-02-26T16:41:28.420 に答える