0

私は.netが初めてです。2 つのコンボボックスcbProductcbBrandNamelabelがあるフォームがありますlblPrice

以下のコードを実装しようとしていますが、 に青い落書きが表示されてい&&ます。(エラー:演算子 '&&' は、タイプ 'ラムダ式' および 'ラムダ式' のオペランドには適用できません)

以下のコードを試しました:(動作しません)

lblPrice.Text = string.Empty;
        lblPrice.Text = doc.Descendants("items"
            ).Where((x => x.Element("productname"
                ).Value.Equals(cbProduct.SelectedItem.ToString())) && /*blue scribbles to '&&'*/
                (y => y.Element("brandname").Value.Equals(cbBrandName.SelectedItem.ToString()
                ))).Select(k => k.Element("price"
                    ).Value).ToString();

私の他の質問は、選択した値をcbProduct明確にしたいということです。以下のコードは、個別の値ではなくすべての値を取ります。

cbProduct.Items.AddRange(doc.Descendants("items"
            ).Select(x => x.Element("productname").Value
            ).ToArray<string>());//adds all products           
        cbProduct.SelectedIndex = 0;

どれか1つ答えればOK

助けてください よろしくお願いし
ます

4

2 に答える 2

2

2 つのラムダを Where 関数に渡し、それらを論理積 (&&) しようとしているようです。そんなことはできません。&& は Where ラムダ内で発生する必要があります。または、2 つの Where 関数を連鎖させることもできます。このようなもの:

    lblPrice.Text = doc.Descendants("items")
                        .Where(x => x.Element("productname").Value.Equals(cbProduct.SelectedItem.ToString()) &&
                                    x.Element("brandname").Value.Equals(cbBrandName.SelectedItem.ToString()))
                        .Select(k => k.Element("price").Value).ToString();

私が目にするもう1つの問題は、クエリをselectで終了しているが、実際には列挙していないことです。あなたはおそらく次のようなことをしたいと思うでしょう:

lblPrice.Text = doc.Descendants("items")
                        .Where(x => x.Element("productname").Value.Equals(cbProduct.SelectedItem.ToString()) &&
                                    x.Element("brandname").Value.Equals(cbBrandName.SelectedItem.ToString()))
                        .Select(k => k.Element("price").Value)
                        .FirstOrDefault();

探している文字列を返すか、何も存在しない場合は null を返します (したがって、この場合は最後の .ToString() 呼び出しをスキップすることをお勧めします。これは、既に Select から文字列を返し、 null で .ToString() を返しているためです)。例外がスローされます)。

于 2012-10-07T12:19:58.577 に答える
1

最初の質問では、1 つの価格を選択したいだけのようです。このコードは、アイテムが.Single(). それ以外の場合はスローされます。その場合.SingleOrDefault()は、見つかったアイテムで null を使用してチェックする必要があります。

lblPrice.Text =
    doc.Descendants("items")
       .Single(x => x.Element("productname").Value == cbProduct.SelectedItem.ToString() &&
                    x.Element("brandname").Value == cbBrandName.SelectedItem.ToString())
       .Element("price").Value;

2 番目の質問については、括弧で閉じる必要があります。次に、と.Selectを呼び出して、個別にフィルタリングし、結果を に射影できます。ランダムな順序で ComboBox ほど厄介なものはないため、そこにも を投入しました。これを試して:.Distinct().ToArray()string[].OrderBy()

cbProduct.Items.AddRange(doc.Descendants("items")
                            .Select(item => item.Element("productname").Value)
                            .Distinct()
                            .OrderBy(item => item)
                            .ToArray());
于 2012-10-07T12:37:00.743 に答える