有两个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();
```