gpt4 book ai didi

c# - 数据表联盟

转载 作者:太空狗 更新时间:2023-10-29 18:18:58 25 4
gpt4 key购买 nike

能否请您检查以下问题。

我需要它的并集,但它返回 6 条记录而不是 5 条记录(因为“Amir”出现了两次)

DataTable dt1 = new DataTable();
dt1.Columns.Add(new DataColumn("Name"));
dt1.Rows.Add(dt1.NewRow()["Name"] = "Imran");
dt1.Rows.Add(dt1.NewRow()["Name"] = "Amir");
dt1.Rows.Add(dt1.NewRow()["Name"] = "Asif");

DataTable dt2 = new DataTable();
dt2.Columns.Add(new DataColumn("Name"));
dt2.Rows.Add(dt2.NewRow()["Name"] = "Tandulkar");
dt2.Rows.Add(dt2.NewRow()["Name"] = "Amir");
dt2.Rows.Add(dt2.NewRow()["Name"] = "Sheqwag");

DataTable dtUnion = dt1.AsEnumerable()
.Union(dt2.AsEnumerable()).CopyToDataTable<DataRow>();

最佳答案

这里的问题是 Linq 不知道您要比较 Name。相反,它对所有对象类型执行它所做的操作,它比较两个不同实例的不同哈希值。

您需要做的是告诉 Union 方法如何比较两个项目。您可以通过创建一个自定义 IEqualityComparer 来做到这一点,该自定义 IEqualityComparer 会按照您希望的方式比较两个数据行。

这是一个示例实现:

class CustomComparer : IEqualityComparer<DataRow>
{
#region IEqualityComparer<DataRow> Members

public bool Equals(DataRow x, DataRow y)
{
return ((string)x["Name"]).Equals((string)y["Name"]);
}

public int GetHashCode(DataRow obj)
{
return ((string)obj["Name"]).GetHashCode();
}

#endregion
}

当调用 Union 时,您需要传入此比较器的实例:

var comparer = new CustomComparer();
DataTable dtUnion = dt1.AsEnumerable()
.Union(dt2.AsEnumerable(), comparer).CopyToDataTable<DataRow>();

更多信息请看这里:
http://msdn.microsoft.com/en-us/library/bb358407.aspx

忠告:
Linq 最适合自定义数据类,DataRow 不是。最好在类上有一个实际的 Name 属性,只有这样 Linq 才能真正发挥作用。
如果您不需要动态模式的灵 active ,您应该远离 DataTable 并实现与您需要的完全相似的自定义类,因为 DataTable 非常臃肿和缓慢。

关于c# - 数据表联盟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9633121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com