如何知道减去两个数组

时间:2014-08-11 08:30:27

标签: c# sql .net arrays datatable

我有一个字符串数组:

private static string[] dataNames = new string[] { "value1", "value2", ..... "value56" };

我的SQL数据库中有一个表,其中包含一个类型为VARCHAR

的列

我想知道数组中存在哪些值,但该列中不存在。

我尝试了什么

var matchingRows = dt.AsEnumerable()
    Where(row => dataNames.Contains(row.Field<string>("ColumnName"), StringComparer.OrdinalIgnoreCase));

其中dt是dataTable,其中包含此查询的结果:

SELECT * FROM table name

现在我在matchingRows变量中有匹配的值,我可以使用g ToArray()将其传输到数组

现在我仍然需要知道如何从dataNames中减去matchingRows数组,以便知道数组中存在哪些值,而不是在表列中退出。

你可以帮我解决这个问题吗

2 个答案:

答案 0 :(得分:2)

使用Enumerable.Except

var columnData = matchingRows.Select(row => row.Field<string>("ColumnName"));
var diff = dataNames.Except(columnData);

为了执行不区分大小写的比较,您需要将IEqualityComparer<string>的实例传递给Except。通常情况下,您必须自己实现此界面,但幸运的是,StringComparer提供了一些开箱即用的自定义字符串比较器。

var diff = dataNames.Except(columnData, StringComparer.InvariantCultureIgnoreCase);

答案 1 :(得分:2)

从表中选择此列的所有值,然后使用Except()方法。

var matchingRows = dt.AsEnumerable()
    .Where(row => dataNames.Contains(row.Field<string>("ColumnName"), StringComparer.OrdinalIgnoreCase))
    .Select(row => row.Field<string>("ColumnName"));

var diff = dataNames.Except(matchingRows, StringComparer.OrdinalIgnoreCase);