首页 新闻 会员 周边

C#两个集合实现库存出库问题

0
悬赏园豆:20 [已解决问题] 解决于 2018-09-14 14:56

两个集合(例如:):
库存数据集合:
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)));
                }
            } 
        }
Luckyfish小文的主页 Luckyfish小文 | 菜鸟二级 | 园豆:335
提问于:2018-09-13 11:57
< >
分享
最佳答案
0

问一个问题啊,你为什么不用键值对的方式存储呢,把物品名称当成键,具体的数量当成值;这样每次在扫描的时候,如果集合已经存在对应的键,那么只需要将对应的值+1即可

收获园豆:15
程序员修炼之旅 | 小虾三级 |园豆:776 | 2018-09-14 11:18

键值对是更方便存数据,不过,每件货的扫描记录也是需要的,所以到最后,还是有一个件数汇总后和库存进行比对。

Luckyfish小文 | 园豆:335 (菜鸟二级) | 2018-09-14 12:23

现在关键是和扫描数据汇总后和库存对比结果总是没算对

Luckyfish小文 | 园豆:335 (菜鸟二级) | 2018-09-14 12:25

@Luckyfish小文: 那也可以啊,键就是物料名称,值就是一个list集合,每扫描一次就是向对应的键值里面加一条数据就是啊,最后统计就只需要统计物料对应键中数据的条数即可啊。
Dictionary<string, List<string>> dictionary= new Dictionary<string, List<string>>();

程序员修炼之旅 | 园豆:776 (小虾三级) | 2018-09-14 14:27

@猴子哥: 扫描字典中,再次扫描的时候,如果有相物料相同,件数如何自+1;

找到方法了,感谢!

Luckyfish小文 | 园豆:335 (菜鸟二级) | 2018-09-14 14:42

@Luckyfish小文: 最终解决问题就好,加油

程序员修炼之旅 | 园豆:776 (小虾三级) | 2018-09-14 16:55
其他回答(1)
0

写一个实体类: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.名称})

收获园豆:5
吴瑞祥 | 园豆:29449 (高人七级) | 2018-09-13 13:06

public class Store
{
public string 名称;
public string 件数;
}
是这样建吗,这是空的值。
直接把Storelist下的名称和数量对应进去?

支持(0) 反对(0) Luckyfish小文 | 园豆:335 (菜鸟二级) | 2018-09-13 14:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册