LINQ查询无法识别重复项

时间:2012-06-14 15:59:42

标签: c# visual-studio-2010 linq

我有两个自定义类。

第一类包含基本数据:

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对象的List,签名如下:

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查询无效。

如果列表中添加了两个相同的项目,我希望我的代码足够智能,只需更新数量,但它似乎无法正常工作。

有人能告诉我LINQ查询有什么问题吗?

3 个答案:

答案 0 :(得分:3)

  

有人能告诉我LINQ查询有什么问题吗?

理论上看起来还不错。我认为我们需要了解有关您的数据的更多信息,以便能够找到它无法正常工作的原因。 LineIDPartNoReasonIDTypeID的组合是否唯一区分项目?由于PartNo是一个字符串,值是不区分大小写的(您的比较区分大小写)?

  

如果列表中添加了两个相同的项目,我希望我的代码足够智能,只需更新数量,但它似乎无法正常工作。

为此,我建议采用不同的方法。请考虑在Equals()类型上覆盖Request。然后,您的Add方法可以检查列表是否已包含该项目,如果是,则增加数量,如果不是,则添加它:

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

答案 1 :(得分:2)

Request实施IEquatable<Request>,因为this is what IndexOf uses

public bool Equals(Request other) {
    return other != null && (this.LineID == other.LineID) && (this.PartNo == other.PartNo) && (this.ReasonID == other.ReasonID) && (this.TypeID == other.TypeID);
}

然后:

public int Add(Request item) {
    if (item != null)
    {
        int ind = list.IndexOf(item);

        if (ind == -1)
        {
            list.Add(item);
            return list.Count - 1;
        }
        else
        {
            list[ind].Qty += item.Qty;
            return ind;
        }                
    }
    return -1;
}

答案 2 :(得分:2)

您可以通过实现LINQ查询来修改方法。例如:

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)
        ).ToList()) {
        x.Qty += item.Qty;
        return list.IndexOf(x);
      }
      list.Add(item);
      return list.Count - 1;
    }
    return -1;
  }

但是,因为您的请求必须是唯一的,所以您可以使用此

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