我有两个自定义类。
第一类包含基本数据:
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查询有什么问题吗?
答案 0 :(得分:3)
有人能告诉我LINQ查询有什么问题吗?
理论上看起来还不错。我认为我们需要了解有关您的数据的更多信息,以便能够找到它无法正常工作的原因。 LineID
,PartNo
,ReasonID
和TypeID
的组合是否唯一区分项目?由于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;
}