【问题标题】:How can I get an item from a generic list based on two conditions?如何根据两个条件从通用列表中获取项目?
【发布时间】:2016-03-09 00:10:21
【问题描述】:

我有一个自定义类型的通用列表,我试图取回其中的一个类型实例。我已经使用需要为真的两个条件尝试了“FirstOrDefault”和“Where”,但是它们都给了我相同的错误消息(“运算符'&&'不能应用于'lambda表达式'类型的操作数和'lambda 表达式'")

他们在这里:

// FirstOrDefault
UnitItemCodeItemID uicii = 
    unitItemCodeItemIDList
        .FirstOrDefault((u => u.Unit == _unit) && (d => d.Description == desc));


// Where
UnitItemCodeItemID uicii = 
    unitItemCodeItemIDList
        .Where((u => u.Unit == _unit) && (d => d.Description == desc));

我不知道这是否相关,但班级是:

public class UnitItemCodeItemID
{
    public string Unit { get; set; }
    public string Description { get; set; }
    public string ItemCode { get; set; }
    public int ItemID { get; set; }
}

【问题讨论】:

  • && 进入 lambda:.FirstOrDefault(u => u.Unit == _unit && u.Description == desc);
  • @DavidG 尽量避免在 cmets 中发布答案。即使是单线,答案就是答案! :-)
  • @GediminasMasaitis 我知道我在做什么,我在这里已经有一段时间了(检查我的代表......)但我认为这个问题不值得一个完整的答案。
  • @GediminasMasaitis - 是的,我同意 DavidG - 提供一个简单的答案作为对问题的评论是完全可以的。
  • @DavidG 我倾向于同意,尤其是当这个问题可能因为印刷错误而被关闭时。

标签: c# generics lambda generic-list


【解决方案1】:

您只需提供一个 lambda:

UnitItemCodeItemID uicii = unitItemCodeItemIDList
    .FirstOrDefault(obj => obj.Unit == _unit && obj.Description == desc);

这样想:这就像在函数中编写一个 foreach 循环一样。像这样:

public UnitItemCodeItemID ExtractFirst(IEnumerable<UnitItemCodeItemID> unitItemCodeItemIDList)
{
    foreach(var obj in unitItemCodeItemIDList)
    {
        if (obj.Unit == _unit && obj.Description == desc)
            return obj;
    }
    return null;
}

您的 Lamba 必须提供“if”部分,其余部分在 Linq 实现中。

【讨论】:

    【解决方案2】:

    您需要提供一个封装这两个条件的 lambda 表达式

    .Where(p => p.Unit == _unit && p.Description == desc);
    

    您之前的尝试是尝试将两个单独的 lambda 表达式与 and 语句结合起来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 2023-02-24
      • 1970-01-01
      • 2014-02-18
      • 2016-11-03
      • 2012-05-09
      相关资源
      最近更新 更多