和Linq中的运算符,并使用linq选择不同的值

时间:2012-10-07 11:41:18

标签: c# xml linq c#-4.0 combobox

我是.net的新手。我有一个表单,其中有两个组合框cbProductcbBrandName以及标签lblPrice

我正在尝试实现以下代码,但它向&&显示蓝色涂鸦。 (错误:运算符'&&'不能应用于'lambda表达式'和'lambda表达式'类型的操作数)

我尝试了以下代码:(无法正常工作

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;

给出任何一个答案都可以

请帮助我
提前致谢

2 个答案:

答案 0 :(得分:2)

看起来你正在将2个lambda传递给Where函数,并尝试将它们合并为逻辑和(&amp;&amp;)。你不能这样做。和&amp;&amp;必须发生在Where lambda内。或者你可以将2个函数链接在一起。像这样:

    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();

我看到的另一个问题是你使用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和.ToString()返回一个字符串在null上将抛出异常)。

答案 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;

对于第二个问题,您需要使用括号关闭.Select,然后您可以调用.Distinct().ToArray()进行过滤以区分结果并将结果投影到{{1 }}。我还在那里抛出一个string[],因为没有什么比随机顺序的ComboBox更烦人了。试试这个:

.OrderBy()