C# 如何将列表项与其他相同类型的列表项进行比较

C# 如何将列表项与其他相同类型的列表项进行比较,c#,generics,C#,Generics,我有以下课程: class Detail { public string Name { get; set; } public string State { get; set; } public string City { get; set;} public List<Transaction> tran { get; set; } } 类详细信息 { 公共字符串名称{get;set;} 公共字符串状态{get;set;} 公共字符串City{get

我有以下课程:

class Detail
{ 
    public string Name { get; set; }
    public string State { get; set; }
    public string City { get; set;}
    public List<Transaction> tran { get; set; }
}
类详细信息
{ 
公共字符串名称{get;set;}
公共字符串状态{get;set;}
公共字符串City{get;set;}
公共列表传输{get;set;}
}
我有两个详细类型列表:ListA和ListB


从ListB中的ListA中删除项目的最快方法是什么?

您可以使用以下性能更好的代码执行此操作:

var oListBHashSet = new HashSet<Detail>(ListB);
ListA.RemoveAll(v => oListBHashSet.Contains(v));
var oListBHashSet=新哈希集(ListB);
RemoveAll(v=>oListBHashSet.Contains(v));
使用HashSet使Contains check变快,并确保序列只计算一次。

最快的方法取决于许多变量,包括列表的大小。如果有少量的项目,那么最快的方法可能是简单的搜索

ListA.RemoveAll(i => !ListB.Contains(i));
如果有更多的元素,那么您可能需要使用中间结构,如
HashSet
,以加快查找过程

var set = nwe HashSet<Detail>(ListB);
ListA.RemoveAll(i => !set.Contains(i));
var set=nwe HashSet(ListB);
ListA.RemoveAll(i=>!set.Contains(i));

哈希集
上的查找速度比
列表
快得多。但是,构建
HashSet
值是有成本的。当处理少量元素时,构建结构的时间可能超过其好处。对于您来说,哪一个更快只能通过分析您的代码来确定。首先,您应该定义equals的含义,然后您可以编写类似这样的代码

var result = ListA.Except(ListB, new Comparer());

公共类比较器:IEqualityComparer
{
公共布尔等于(详图x、详图y)
{
返回x.Name==y.Name
&&x.状态==y.状态
&&x.城市==y.城市
&&x.tran.SequenceEqual(y.tran);
}
公共int GetHashCode(详细信息obj)
{
返回obj.Name.GetHashCode();
}
}

PS:同样的相等问题也适用于
事务
对象

当一个细节实例等于另一个细节实例时?
public class Comparer : IEqualityComparer<Detail>
{

    public bool Equals(Detail x, Detail y)
    {
        return x.Name == y.Name
                && x.State == y.State
                && x.City == y.City
                && x.tran.SequenceEqual(y.tran);
    }

    public int GetHashCode(Detail obj)
    {
        return obj.Name.GetHashCode();
    }
}