我有一个名为SearchItem的类,它扩展了另一个名为Claim的类。为简洁起见,我只是简单地包括类名及其属性。
public class SearchItem : Claim {
public int FileStreamID { get; set; }
public Int16 UploadedByLabID { get; set; }
public string FileName { get; set; }
public string TypeDesc { get; set; }
public string UploadedByLab { get; set; }
public string UploadedByUser { get; set; }
public DateTime? UploadDate { get; set; }
}
public class Claim {
public int ClaimID { get; set; }
public string DOB_Format {
get {
string s = "";
if (this.DOB.HasValue)
s = this.DOB.Value.ToString("MM/dd/yyyy");
return s;
}
}
public string FirstName { get; set; }
public string FullClaimDesc {
get {
return this.FullName + " (" + this.SSN_Mask + ")";
}
}
public string FullName {
get {
string s = this.LastName + ", " + this.FirstName;
if (!string.IsNullOrEmpty(this.MiddleName))
s += " " + this.MiddleName;
return s;
}
}
public string LastName { get; set; }
public string MiddleName { get; set; }
public string SSN { get; set; }
public string SSN_Mask {
get {
string s = "";
if (this.SSN.Length > 0)
s = Claim.FormatHyphens(this.SSN);
return s;
}
}
public string Suffix { get; set; }
public DateTime? DOB { get; set; }
public DateTime? RequestDate { get; set; }
public Int16 OwnedByLabID { get; set; }
public List<Int16> lstLabRecipientID { get; set; }
}
我有两个包含n个SearchItems的列表。
List<SearchItems> lstMain = new List<SearchItems>();
List<SearchItems> lstTemp = new List<SearchItems>();
假设lstMain包含25个SearchItems,而lstTemp包含5个SearchItems。我想要做的是使用Intersect来检索lstMain和lstTemp之间相同的SearchItem。
IEnumerable<SearchItem> results = lstMain.Intersect(lstTemp);
然而,结果总是空洞的。我确信这两个列表包含3个相同的SearchItem,并且相同我的意思是它们的属性产生相同的值(即 - lstMain [2] .ClaimID = 965和lstTemp [0] .ClaimID = 965等)
所以我期待Intersect扩展方法过多吗?它不能处理实现继承的Complext类型吗?
答案 0 :(得分:4)
由于我假设两个列表中被视为“相同”的项目的类实例不同,因此您需要自定义IEqualityComparer<SearchItem>
来使用Intersect()
,您可以将其作为第二个参数传递。
在IEqualityComparer<SearchItem>
的实现中,您必须比较两个SearchItem
实例的属性,以确定它们是否应该被视为相等,可以找到一个示例here。
答案 1 :(得分:3)
由于您的课程未实施IEquatable<SearchItems>
,您需要使用允许IEqualityComparer<T>
的{{3}}。
答案 2 :(得分:0)
您应该在SearchItem上实现GetHashCode和Equals方法,以便可以比较两个不同的实例。 (默认情况下,如果两个对象是对同一实例的引用,则认为它们相等)