使用LINQ交叉两个列表

时间:2011-06-27 17:38:27

标签: asp.net linq list comparison

我有一个名为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类型吗?

3 个答案:

答案 0 :(得分:4)

由于我假设两个列表中被视为“相同”的项目的类实例不同,因此您需要自定义IEqualityComparer<SearchItem>来使用Intersect(),您可以将其作为第二个参数传递。

IEqualityComparer<SearchItem>的实现中,您必须比较两个SearchItem实例的属性,以确定它们是否应该被视为相等,可以找到一个示例here

答案 1 :(得分:3)

由于您的课程未实施IEquatable<SearchItems>,您需要使用允许IEqualityComparer<T>的{​​{3}}。

答案 2 :(得分:0)

您应该在SearchItem上实现GetHashCode和Equals方法,以便可以比较两个不同的实例。 (默认情况下,如果两个对象是对同一实例的引用,则认为它们相等)