【问题标题】:How to know subtract two arrays如何知道两个数组相减
【发布时间】:2014-10-04 00:30:45
【问题描述】:

我有一个字符串数组:

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 是包含此查询结果的数据表:

SELECT * FROM table name

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

现在我仍然需要知道如何从matchingRows 中减去dataNames 数组,以便知道哪些值存在于数组中并且不存在于表格列中。

你能帮我解决这个问题吗

【问题讨论】:

    标签: c# sql .net arrays datatable


    【解决方案1】:

    从表中选择该列的所有值,然后使用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);
    

    【讨论】:

    • @AgnieszkaPolec 谢谢。很高兴能提供帮助。
    • 请做最后一件事。数组都是大写字母,匹配值有时是大写字母,有时是小写字母,所以你的答案不起作用。除了不区分大小写,你能做到这一点吗?
    【解决方案2】:

    使用Enumerable.Except

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

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

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

    【讨论】:

    • matchingrows 是 DataRows 而dataNames 包含字符串
    • 我已经试过了,我有语法错误,如果你愿意我可以告诉你
    • @dcastro 我现在收到错误,因为 matchingRows 不包含字段的定义
    • @dcastro: matchingRowsIEnumerable&lt;DataRow&gt; 不是一个单独的数据行,Farhad 在他的回答中显示了正确的方法。
    • +1 为您与我的努力,但其他人首先帮助我。
    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    相关资源
    最近更新 更多