C#比较两个datatable的差异

有两个datatable,dt1中有姓名,学号,dt2中只有name,除了遍历怎样将dt1中姓名这一列存在但是dt2中usename没有的数据保存到一个新的datatable中

除了遍历DataTable的每行数据外,还可以使用LINQ将DataTable转换成字典集合,之前我回答过类似的问题,请参考:

以下是本问题的一种实现方案,供教参:

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text.Json;

namespace ConsoleApp2
{
    public class MyProgram
    {
        static void Main(string[] args)
        {
            DoWork();
            Console.ReadKey();
        }

        static void DoWork()
        {
            var dt1 = new DataTable();
            dt1.Columns.Add("No");
            dt1.Columns.Add("Name");
            dt1.Rows.Add(1, "Tom1");
            dt1.Rows.Add(2, "Tom2");
            dt1.Rows.Add(3, "Tom3");
            var list1 = dt1.ConvertToList();
            Console.WriteLine("table 1中的数据...");
            Console.WriteLine(JsonSerializer.Serialize(list1));

            var dt2 = new DataTable();
            dt2.Columns.Add("Name");
            dt2.Rows.Add("Tom1");
            dt2.Rows.Add("Tom3");
            var list2 = dt2.ConvertToList();
            Console.WriteLine("table 2中的数据...");
            Console.WriteLine(JsonSerializer.Serialize(list2));

            var result = list1.Where(x => !list2.Any(a => a["Name"] == x["Name"]));
            Console.WriteLine("对比后的数据...");
            Console.WriteLine(JsonSerializer.Serialize(result));
        }

    }

    public static class DataTableExtension
    {
        public static List<Dictionary<string, string>> ConvertToList(this DataTable dataTable)
        {
            return dataTable.AsEnumerable().Select(
                row => dataTable.Columns.Cast<DataColumn>().ToDictionary(
                    column => column.ColumnName, // 键
                    column => row[column] as string // 值
                )
            ).ToList();
        }
    }
}

运行结果:

table 1中的数据...
[{"No":"1","Name":"Tom1"},{"No":"2","Name":"Tom2"},{"No":"3","Name":"Tom3"}]
table 2中的数据...
[{"Name":"Tom1"},{"Name":"Tom3"}]
对比后的数据...
[{"No":"2","Name":"Tom2"}]
var rst = dt1.AsEnumerable()
    .Where(x => dt2.AsEnumerable().Any(y => y.Field<string>("姓名") == x.Field<string>("姓名")))
    .CopyToDataTable();

```