【问题标题】:How to find the NOT of Data Table如何找到数据表的非
【发布时间】:2012-02-02 03:55:31
【问题描述】:

我有两个数据表,例如 dt1 和 dt2。 dt1 包含所有国家的列表,dt2 包含少数国家列表。 我需要一个数据表 dt3,它应该包含除了 dt2 中的国家/地区列表之外的所有国家/地区。

【问题讨论】:

  • 到目前为止您尝试过什么? SO会帮助你;我们不会为你做你的工作。
  • DonCallisto 不是家庭作业。实际上我有一个包含某些值的下拉列表。用户可以从中选择值。我想维护两个数据表。从数据库加载的一个。和一个临时数据表,其中将包含从下拉列表中选择的值,我希望在 ajax 上重新绑定显示临时数据表中不存在的所有值的数据表

标签: c# .net


【解决方案1】:

要使用Except,您需要使用采用IEqualityComparer<DataRow> 的重载,因为默认比较器将返回dt1 中的所有行,因为它们与dt2 中的DataRows 不同。

例如,使用这个简单的实现(你应该添加错误处理):

public class CountryRowComparer : IEqualityComparer<DataRow>
{
    public bool Equals(DataRow r1, DataRow r2)
    {
        return r1["Country"] == r2["Country"];
    }

    public int GetHashCode(DataRow r)
    {       
        return r["Country"].GetHashCode();
    }
}

您可以获取dt1 中不在dt2 中的国家/地区,如下所示:

var dt3 = dt1.AsEnumerable().Except(dt2.AsEnumerable(), new CountryRowComparer()).CopyToDataTable();

如果您不想为此创建一个IEqualityComparer 类,另一种获取dt1 中不在dt2 中的国家/地区的方法是:

var exclude = dt2.AsEnumerable()
                 .Select(r => r.Field<string>("Country"));

var dt3 = dt1.AsEnumerable()
             .Where(r => !exclude.Contains(r.Field<string>("Country")))
             .CopyToDataTable();

【讨论】:

    【解决方案2】:

    使用Enumerable.Except(IEnumerable, IEnumerable) Method:

    DataTable onlyInFirstTable = dt1.AsEnumerable().Except(dt2.AsEnumerable()).CopyToDataTable();
    

    【讨论】:

    • 这就是我们所需要的。
    猜你喜欢
    • 2016-06-10
    • 2019-07-04
    • 2019-06-29
    • 1970-01-01
    • 2017-01-15
    • 2011-04-14
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多