【问题标题】:and operator in Linq and select distinct values using linq和 Linq 中的运算符并使用 linq 选择不同的值
【发布时间】:2012-10-07 11:41:18
【问题描述】:

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

任何一个答案都可以

请帮助我
提前致谢

【问题讨论】:

  • 1.我认为您的括号太多(在您的 AND 周围)2. Distinct() - 在选择值之前执行此操作。
  • @Bridge 1. 许多红色涂鸦显示我是否删除括号 2. 我不知道在哪里声明它.. 我仍在学习 linq

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


【解决方案1】:

看起来您正在将 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 上将引发异常)。

【讨论】:

  • 我认为迈克尔就在上面。 Select 之后的 Distinct 方法应该可以解决问题。
【解决方案2】:

对于第一个问题,您似乎只想选择一个价格。假设该项目由.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() 过滤到不同的值并将结果投影到string[]。我还在那里扔了一个.OrderBy(),因为没有什么比随机排列的组合框更烦人的了。试试这个:

cbProduct.Items.AddRange(doc.Descendants("items")
                            .Select(item => item.Element("productname").Value)
                            .Distinct()
                            .OrderBy(item => item)
                            .ToArray());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多