两个集合(例如:):
库存数据集合:
List<string> Storelist = new List<string>();
Storelist.Add("物料A"+":"+"3件");
Storelist.Add("物料B"+":"+"2件");
Storelist.Add("物料C"+":"+"1件");
Storelist.Add("物料D"+":"+"5件");
出库扫描记录:
List<string> Scanlist = new List<string>();
Scanlist.Add("物料A"+":"+"1件");
Scanlist.Add("物料A"+":"+"1件");
Scanlist.Add("物料B"+":"+"1件");
Scanlist.Add("物料D"+":"+"1件");
Scanlist.Add("物料D"+":"+"1件");
Scanlist.Add("物料D"+":"+"1件");
Scanlist.Add("物料D"+":"+"1件");
要的结果就是(出库后,每种物料各剩下多少件):
物料A:1件
物料B:1件
物料C:1件
物料D:1件
问题补充中,我用的比较笨的方法,把字符拆开,再去比对;对于多件的物料,用重复值统计,计数都 正确,就是最后,和库存相减的时候,算出来总是不对。
foreach (string item in Scanlist)
{
Storelist.Remove(item);
}
List<string> wllist = new List<string>();
string[] arr =Scanlist.ToArray(); //把扫描清单赋给数组
int scanqty = 0;
string wl = string.Empty;
string scanwl = string.Empty;
foreach (var ir in arr.GroupBy(c => c))
{//数组中找出重复的元素,并且计数
wl = ir.Key.ToString();//元素
scanqty = ir.Count();
scanwl = wl.Substring(0, wl.LastIndexOf(";")).ToString();
wllist.Add(scanwl+";件数:"+scanqty);
}
foreach (string rr in wllist)
{
string gwl = rr.Substring(0, rr.LastIndexOf(";")).ToString();
string gqty = rr.Substring(rr.LastIndexOf(":") + 1).ToString();
for (int k = 0; k < Storelist.Count; k++)
{
string item2 = Storelist[k].ToString();
string storewl = item2.Substring(0, item2.LastIndexOf(";")).ToString();//编码
string storeqty = item2.Substring(item2.LastIndexOf(":") + 1).ToString();//库存件数
if (storewl.Equals(gwl) && !storeqty.Equals(gqty))
{//物流编码相同,但件数不同,先移除再添加
Storelist.Remove(item2);
Storelist.Add(storewl + ";" + "件数:" + (int.Parse(storeqty) - int.Parse(gqty)));
}
}
}
问一个问题啊,你为什么不用键值对的方式存储呢,把物品名称当成键,具体的数量当成值;这样每次在扫描的时候,如果集合已经存在对应的键,那么只需要将对应的值+1即可
键值对是更方便存数据,不过,每件货的扫描记录也是需要的,所以到最后,还是有一个件数汇总后和库存进行比对。
现在关键是和扫描数据汇总后和库存对比结果总是没算对
@Luckyfish小文: 那也可以啊,键就是物料名称,值就是一个list集合,每扫描一次就是向对应的键值里面加一条数据就是啊,最后统计就只需要统计物料对应键中数据的条数即可啊。
Dictionary<string, List<string>> dictionary= new Dictionary<string, List<string>>();
@猴子哥: 扫描字典中,再次扫描的时候,如果有相物料相同,件数如何自+1;
找到方法了,感谢!
@Luckyfish小文: 最终解决问题就好,加油
写一个实体类:class 库存{名称,数量}
然后就可以Scanlist= Scanlist.groupby(a=>a.名称).select(n=>new{名称=n.key,数量=n.sum(a=>a.数量)})
Storelist.select(a=>new{数量=a.数量-Scanlist.first(s=>s.名称==a.名称).数量,名称=a.名称})
public class Store
{
public string 名称;
public string 件数;
}
是这样建吗,这是空的值。
直接把Storelist下的名称和数量对应进去?