【问题标题】:Get count of two joined data tables获取两个连接数据表的计数
【发布时间】:2017-06-23 03:33:12
【问题描述】:

我的 C# 代码中有两个数据表,每个数据表都有一个名为 ID 的列,类型为 string

我想(内部)连接 ID 列上的两个表并获取公共行的计数。我不需要 ID 本身,只需要常用 ID 的数量。

其中一个表可能有重复的 ID,但连接必须只考虑不同的值,因此如果有两行 ID=544,它们应该只计为一个。

这两个表每个可能有超过一百万行,因此性能是一个问题。用 C# 编写代码最简单、最有效的方法是什么?

【问题讨论】:

  • 显示你目前尝试过的代码
  • 在你向谷歌询问你的标签和大量关于你的实际问题的清晰简明陈述之前,请保留一个作为标题。例如,您可以组合来自“c# datatable count number of values in a common column”的两个匹配项。 PS 您的数据是如何准确地存储的?请阅读minimal reproducible example并采取行动。
  • Linq join with COUNT的可能重复
  • @uɐpuɐɥƆ - 我没有尝试过任何事情,因为我知道没有数据表方法可以加入,而且我在 Google 上找不到任何我可以使用的 Linq。我不想将数据转储到 SQL 中并运行我知道的 SQL 查询:-)。或者我可以对表格进行排序并在一次迭代中串联遍历(合并连接样式),但为什么要重新发明轮子呢?
  • @philipxy - 我看到了,但我不明白哪一部分是我需要删除的左连接,以及我需要保留哪一部分来计数。此外,我认为您可以计算其中一张表中的每一行。

标签: c# datatable count inner-join


【解决方案1】:

它需要一个简单的内部连接。如果我在这里正确理解你,我已经给出了解决方案。试试看,如果它解决了您的问题,请告诉我

using System;
using System.Linq;
using System.Data;

namespace JoinDatatablesConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt1 = new DataTable();
            dt1.Columns.Add("ID", typeof(string));
            DataTable dt2 = new DataTable();
            dt2.Columns.Add("ID", typeof(string));
            for(int i=1;i<5;i++)
            {
                DataRow dr1 = dt1.NewRow();
                dr1["ID"] = i + "A";
                dt1.Rows.Add(dr1);
                DataRow dr2 = dt2.NewRow();
                dr2["ID"] = i + "A";
                dt2.Rows.Add(dr2);
            }
            DataRow dr3 = dt2.NewRow();
            dr3["ID"] = "7A";
            dt2.Rows.Add(dr3);

            var commonData = (from f1 in dt1.AsEnumerable()
                               join f2 in dt2.AsEnumerable()
                               on f1.Field<string>("ID")
                               equals f2.Field<string>("ID")
                               select f1.Field<string>("ID"))
                                           .Distinct().ToList();
            Console.WriteLine("Common Data : ");
            foreach(var item in commonData)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine("Common Data Count : " + commonData.Count);
            Console.Read();
        }
    }
}

【讨论】:

  • 您需要选择 distinct。并在您的测试数据中有重复项。并告诉 OP 需要minimal reproducible example
  • @uɐpuɐɥƆ - 有效!谢谢!
  • @uɐpuɐɥƆ - 哦等等,我如何编码选择不同的?我是 Linq 新手。
  • 知道了!再次感谢。
  • @user3517113 你需要付出更多的努力——这似乎是最微小的努力。作为一个新手并不能成为你不浪费别人时间的借口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
相关资源
最近更新 更多