sorunu 6 rekoru 5 yerine döndüren Linq Eğer Name
karşılaştırmak istiyorum bilmiyor olmasıdır. Bunun yerine, tüm nesne türleri için yaptığı, iki farklı örnek için farklı olan karma karşılaştırır.
Yapmanız gereken şey, Union yöntemine iki öğenin nasıl karşılaştırılacağını anlatmaktır. İki veri satırını istediğiniz gibi karşılaştıran özel bir IEqualityComparer
oluşturarak bunu yapabilirsiniz. İşte
örnek bir uygulamasıdır:
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
}
sonra bu karşılaştırıcısı örneğine geçmek gerekir Union
arayarak:
http://msdn.microsoft.com/en-us/library/bb358407.aspx
: Daha fazla bilgi için buraya bakınız
var comparer = new CustomComparer();
DataTable dtUnion = dt1.AsEnumerable()
.Union(dt2.AsEnumerable(), comparer).CopyToDataTable<DataRow>();
Tavsiye edilen kelime:
Linq, DataRow
'un olmadığı özelleştirilmiş veri sınıflarıyla en iyisidir. Sınıfta gerçek bir Name özelliğine sahip olmak en iyisidir, sadece Linq gerçekten parlayabilir.
Dinamik şemanın esnekliğine ihtiyacınız yoksa, DataTable
'dan uzak kalmalı ve tam olarak ihtiyacınız olana benzeyen özel sınıflar kullanmalısınız, çünkü DataTable
son derece şişirilmiş ve yavaştır. senin datatables' şemalar aynıdır