繁体   English   中英

如何使用LINQ或C#以其他方式匹配来自两个数据表的数据具有单行

[英]How to match data from two data tables have single row using LINQ or C# other way

我有两个数据表,如下所示,从其他数据表中获取数据

DataTable dt  
DataTable dt2 

数据表dt具有低于值的值,并且每次dt和dt2仅具有单行值时,就可以轻松匹配

F1    F2   F3    F4
Yes   No   Yes   No

数据表dt2具有以下值

F1    F2   F3
Yes   Yes  Yes

我想将下面的输出匹配到Data-table dt3中,两者都在列名上

F1   F3
Yes  Yes 

请参见datatable dt和datable dt2每次都只有一行,因此您可以匹配dynamic,因为它们只有一行具有列名和值,所以我不知道如何使用LINQ或其他方式与dynamic进行更好的理解请检查下图

在此处输入图片说明

我相信有人可能会做得更好,但这是我的。 ※简化了答案。

private static DataTable RegenerateDataTableInCommon(DataTable dt, DataTable dt2)
{
    var dtRows = dt.Rows.Cast<DataRow>();
    var dt2Rows = dt2.Rows.Cast<DataRow>();
    var dtColumnNames = dt.Columns.Cast<DataColumn>().Select(dtC => dtC.ColumnName);

    var columnNameMatched = dt2.Columns.Cast<DataColumn>().Select(dtC => dtC.ColumnName).Where(colName => dtColumnNames.Contains(colName));
    var cellValueMatched = columnNameMatched.Where(colName => dtRows.First()[colName] == dt2Rows.First()[colName]);

    DataTable outDt = new DataTable();
    outDt.Clear();
    DataRow nRow = outDt.NewRow();
    foreach (var colName in cellValueMatched)
    {
        outDt.Columns.Add(colName);
        nRow[colName] = dtRows.First()[colName];
    }
    outDt.Rows.Add(nRow);

    return outDt;
}

如果没有linq是一个选项,则可以尝试以下方法:

public DataTable getMatchedColumnAndValue(DataTable dt1, DataTable dt2)
{
   try
   {

      var ndt = new DataTable();
      //creating columns for the table
      var dt1columns = dt1.Columns.Cast<DataColumn>().Select(s => s.ColumnName).ToList();
      var dt2columns = dt2.Columns.Cast<DataColumn>().Select(s => s.ColumnName).ToList();
      var MatchedCol = dt1columns.Intersect(dt2columns).ToList();
      foreach (var col in MatchedCol)
      {
         ndt.Columns.Add(col);
      }
      //creating columsn matcehd row
      var drnew = new string[MatchedCol.Count];
      for (int i = 0; i < MatchedCol.Count; i++)
      {
         if (dt1.Rows[0][MatchedCol[i]].ToString() == dt2.Rows[0][MatchedCol[i]].ToString())
              drnew[i] = dt1.Rows[0][MatchedCol[i]].ToString();
         else
              drnew[i] = null;
      }
      ndt.Rows.Add(drnew);

      //removing null value columns
      foreach (var col in MatchedCol)
      {
         if (ndt.AsEnumerable().All(dr => dr.IsNull(col)))
             ndt.Columns.Remove(col);
      }

      return ndt;
    }
    catch (Exception ex)
    {
       throw ex;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM