0

我是.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;

给出任何一个答案都可以

请帮助我
提前谢谢

4

2 回答 2

2

看起来您正在将 2 个 lambdas 传递给 Where 函数并尝试将它们逻辑和 (&&) 在一起。你不能那样做。&& 必须出现在 Where lambda 中。或者您可以将 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();

我看到的另一个问题是您以选择结束查询,但从未真正枚举它。你可能想做这样的事情:

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会抛出异常)。

于 2012-10-07T12:19:58.577 回答
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()and.ToArray()过滤到 distincts 并将结果投影到string[]. 我也在.OrderBy()那里扔了一个,因为没有什么比随机顺序的 ComboBox 更烦人的了。试试这个:

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