【问题标题】:Difference of two DataTables in c# using LINQ使用 LINQ 的 c# 中两个数据表的差异
【发布时间】:2016-05-27 05:45:02
【问题描述】:

II有如下两个数据表

dtOne
-------------------------
  ID  |   Name 
--------------------------
 101  |  ABC
 102  |  XYZ
 103  |  MNO
 104  |  PQR
--------------------------

dtTwo
-------------------------
  ID  |   Name 
--------------------------
 101  |  FGH
 102  |  XYZ
 104  |  GPS
--------------------------

我只希望结果为 in dtOnenot in dtTwo (dtOne-dtTwo) 的数据

dtResult
-------------------------
  ID  |   Name 
--------------------------
 103  |  MNO
--------------------------

我怎样才能做到这一点。

我使用了 LINQ 的 except 方法,但结果是这样的 101 | ABC

 103  |  MNO
 104  |  PQR
 101  |  FGH

 104  |  GPS

这意味着在 except 方法中匹配两列

【问题讨论】:

  • 你的数据选择条件是什么?

标签: linq datatable


【解决方案1】:

如果您尝试根据 DataTable 中的多列查找符合条件的行,请尝试以下操作

string stationToFind = "ABC";
DateTime dateToFind = new DateTime(2016, 5, 26);
var result = dataTable.AsEnumerable().Where(row => row.Field<string>("station") == stationToFind 
                 && row.Field<datetime>("date") == dateToFind).ToList();

如果您只期望一行,那么您可以使用 .FirstOrDefault() 而不是 .ToList()

【讨论】:

  • 我不仅有 ABC ,,,我还有很多重复的值
  • 我不确定您要搜索的确切标准。您需要查找特定站点的所有行吗?还是特定的电台和日期范围?
  • not specific station .....我有一个数据表,其中 4 列现在我想根据日期时间过滤最新数据,并且还需要 uniqe 站点
【解决方案2】:
        DataTable dt = new DataTable();
        dt.Columns.Add("station", typeof(string));
        dt.Columns.Add("max_temp", typeof(double));
        dt.Columns.Add("min_temp", typeof(double));

        dt.Rows.Add("XYZ", 14.5, 3.5);
        dt.Rows.Add("XYZ", 14.5, 3.5);
        dt.Rows.Add("XYX", 13.5, 3.5);
        dt.Rows.Add("ABC", 14.5, 5.5);
        dt.Rows.Add("ABC", 12.5, 3.5);
        dt.Rows.Add("ABC", 14.5, 5.5);

        var maxvalue = dt.AsEnumerable().Max(s => s.Field<double>("max_temp"));

        var coll = dt.AsEnumerable().Where(s => s.Field<double>("max_temp").Equals(maxvalue)).
            Select(s => new { station = s.Field<string>("station"), maxtemp = s.Field<double>("max_temp"), mintemp = s.Field<double>("min_temp") }).Distinct();

        foreach (var item in coll)
        {
            Console.WriteLine(item.station + " - " + item.maxtemp + " - " + item.mintemp);
        }

【讨论】:

    猜你喜欢
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多