我有两个自定义类。

第一类包含基本数据:

public class Request
{
    public Request(int lineID, string partNo, int qty, int reasonID, int typeID)
    {
        LineID = lineID;
        PartNo = partNo;
        Qty = qty;
        ReasonID = reasonID;
        TypeID = typeID;
    }
    public int LineID { get; private set; }
    public string PartNo { get; private set; }
    public int Qty { get; internal set; }
    public int ReasonID { get; private set; }
    public int TypeID { get; private set; }
}


第二类包含这些Request对象的列表,其签名如下:

public class Requests : IEnumerable<Request>
{
    private List<Request> list;

    public Requests()
    {
        list = new List<Request>();
    }

    public int Add(Request item)
    {
        if (item != null)
        {
            foreach (var x in list.Where(r =>
              (r.LineID == item.LineID) &&
              (r.PartNo == item.PartNo) &&
              (r.ReasonID == item.ReasonID) &&
              (r.TypeID == item.TypeID)))
            {
                x.Qty += item.Qty;
                return list.IndexOf(x);
            }
            list.Add(item);
            return list.Count - 1;
        }
        return -1;
    }

    // other code
}


我正在测试我的代码,添加项目会将新项目放入列表中,但是用于查找重复项的LINQ查询无法正常工作。

如果将2个相同的项目添加到列表中,我希望我的代码足够聪明,可以简单地更新数量,但是似乎不起作用。

有人可以告诉我LINQ查询出了什么问题吗?

最佳答案

有人可以告诉我LINQ查询出了什么问题吗?


从理论上讲,它看起来不错。我认为我们需要了解有关您的数据的更多信息,以便找出为什么它无法按预期工作。 LineIDPartNoReasonIDTypeID的组合是否唯一区分一项?由于PartNo是字符串,因此值是否区分大小写(您的比较区分大小写)?


  如果将2个相同的项目添加到列表中,我希望我的代码足够聪明,可以简单地更新数量,但是似乎不起作用。


为此,我建议采用另一种方法。考虑覆盖Equals()类型的Request。然后,您的Add方法可以只检查列表中是否已经包含该商品,如果增加则增加数量,如果没有则增加数量:

var idx = list.IndexOf(item);
if(idx != -1)
{
    list[idx].Qty += item.Qty;
}
else
{
    list.Add(item);
}

关于c# - LINQ查询无法识别重复项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11036935/

10-13 07:32