【问题标题】:Perform functions based on 2 datatables基于 2 个数据表执行功能
【发布时间】:2017-08-07 18:27:43
【问题描述】:

我四处寻找答案,但没有发现任何适合我正在尝试做的事情。

我有 2 个数据表,1 个从 Excel 工作表导入 - 另一个在 C# 事件中创建。数据表 1 包含每批货物或套件的标志数量。标志的名称/类型为 SVL-01、SVL-02 等。数据表 2 包含这些相同的标志名称/类型,但也包含每种类型的每个单个标志的权重。我正在尝试遍历数据表 1,计算每个项目的权重,并为每一行放置一个总和列和总和。

基本上 - 其中 Datatable 1 ColumnName = Datatable 2 标志名称,权重变量将 = Datatable 2 中列出的权重。

我很确定我没有正确加载图像。

Datatable 1

【问题讨论】:

  • 附图是数据表2,不是1
  • 我没有完整的解决方案,但您或许应该考虑使用 LINQ 将两个数据表连接在一起。
  • 这是我发现研究如何做到这一点的事情之一。但是当我将它们加在一起时,我仍然不确定如何通过可变索引来获得正确列的正确权重。
  • 请在问题中为两个表添加更完整的数据样本,而不是图像。另外,你想要什么格式的结果?
  • 嗯 - 不知道如何在此处添加表格信息。当我尝试粘贴时,它会被可怕地包裹起来。

标签: c# arrays datatable


【解决方案1】:

我使用previous solution 作为基础来生产更符合您需求的产品:

/* setup schema and sample data */
            DataTable kit = new DataTable("Kits");
            kit.Columns.Add(new DataColumn("Kit ID"));
            kit.Columns.Add(new DataColumn("Sign Type"));
            kit.Columns.Add(new DataColumn("Sign Count", typeof(int)));


            DataTable signs = new DataTable("Signs");
            signs.Columns.Add(new DataColumn("Sign Type"));
            signs.Columns.Add(new DataColumn("Sign Weight", typeof(int)));

            DataRow rowBuffer = kit.NewRow();

            rowBuffer["Kit ID"] = "Kit 1";
            rowBuffer["Sign Type"] = "SVL-01";
            rowBuffer["Sign Count"] = 4;

            kit.Rows.Add(rowBuffer);

            rowBuffer = signs.NewRow();

            rowBuffer["Sign Type"] = "SVL-01";
            rowBuffer["Sign Weight"] = 44;

            signs.Rows.Add(rowBuffer);

            DataTable kitWeight = new DataTable();
            kitWeight.Columns.Add("Kit Type", typeof(string));
            kitWeight.Columns.Add("Kit Weight", typeof(int));

            /* join table and produce output set */

            var result = from dataRows1 in kit.AsEnumerable()
                         join dataRows2 in signs.AsEnumerable()
                         on dataRows1.Field<string>("Sign Type") equals dataRows2.Field<string>("Sign Type") into lj
                         from r in lj.DefaultIfEmpty()
                         select kitWeight.LoadDataRow(new object[]
                         {
                            dataRows1.Field<string>("Kit ID"),
                            dataRows1.Field<int>("Sign Count") * r.Field<int>("Sign Weight")
                          }, false);

            /* iterate through results - we could do the multiplication here or like we did in the LINQ up above */
            foreach (DataRow v in result)
                Console.WriteLine(v["Kit Type"] + "\t" + v["Kit Weight"]);

【讨论】:

  • 我认为这需要完全重新格式化 datatable1。符号类型实际上是数据表1中的一个列标题。
猜你喜欢
  • 1970-01-01
  • 2017-03-15
  • 2020-12-25
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 2022-07-06
  • 2013-12-09
  • 1970-01-01
相关资源
最近更新 更多