LINQはそれよりもはるかに怖いように見えます。アニルダの答えには2つのビットが使用されていますが、これについて説明します。1つ目は.Select(x=>
です。これは、「リスト内のすべてのものについて、それを何かに置き換える」ことを意味します。xは、リスト内の各アイテムを表します。
例えば:
new string[]{"a", "b", "c"}.Select(x=>x.ToUpper());
{"a"、 "b"、 "c"}の配列を{"A"、 "B"、"C"}の配列に変換します。それはただ「リストの中のそれぞれのものを取り、それを呼び出すことによってあなたが得るものとそれを置き換える」と言っているだけですToUpper()
。
LINQの他のビットはです.Where(x=>
。それはただ「この声明が真実であるものだけを含むより小さなリストを私にください」と言っています。それで
new string[]{"a", "b", "c"}.Where(x=>x == "a");
{"a"}のリストが表示されます。に置き換えるx == "a"
とx != "b"
、{"a"、"c"}のリストが表示されます。つまり、コードの2番目のビットでは、「各アイテムを製品名に置き換える前に、一致させたいものと一致しないものをすべて除外します。次に、残っているものを変換します。 「」
これらをコード例に適用するために、行を再フォーマットしてコメントします。
// To set the first combo box:
cbProduct.Items.AddRange( // Add everything we produce from this to the cbProduct list
doc.Descendants("items") // For each thing that represents an "items" tag and it's subtags
.Select(x=>x.Element("productname").Value) // Transform it by getting the "productname" element and reading it's Value.
.ToArray<string>()); // Then convert that into a string[].
// To set the second combo box:
string product2Search=cbProduct.SelectedItem.ToString();// get the currently selected value of cbProduct.
cbBrandName.Items.Clear(); //clears all items in cbBrandNamedoc
cbBrandName.Items.AddRange( // Add everything we produce from this to the cbBrandName list
doc.Descendants("items") // For each thing that represents an "items" tag and it's subtags
.Where(x=>x.Element("productname").Value==product2Search) // Filter our list to only those things where the productname matches what's currently selected in cbProduct (which we just stored)
.Select(y=>y.Element("brandname").Value) // Transform it by getting the "brandname" element and reading it's Value.
.ToArray<string>()); // Then convert that into a string[]
それは役に立ちましたか?自分でコーディングするときは、長いLINQステートメントを次のように別々の行に配置して分割するのが好きです。そうすれば、次の行を読み取ることができます。その上に、それをアレイに変えてください。」