我有以下课程:
class Detail
{
public string Name { get; set; }
public string State { get; set; }
public string City { get; set;}
public List<Transaction> tran { get; set; }
}
我有两个详细信息类型列表:ListA&amp;数组listB。
从ListB中存在的ListA中删除项目的最快方法是什么?
答案 0 :(得分:4)
首先,您应该定义 equals 的含义,然后您可以编写类似这样的内容
var result = ListA.Except(ListB, new Comparer());
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();
}
}
PS:对于Transaction
对象
答案 1 :(得分:0)
“最快”的方式取决于很多变量,包括列表的大小。如果有少量商品,那么最快的方式可能是简单的搜索
ListA.RemoveAll(i => !ListB.Contains(i));
如果元素数量较多,那么您可能希望使用像HashSet<Detail>
这样的中间结构来加速查找过程
var set = nwe HashSet<Detail>(ListB);
ListA.RemoveAll(i => !set.Contains(i));
HashSet<Detail>
的查找速度比List<Detail>
快得多。但是,建立HashSet<Detail>
值需要付出代价。在处理少量元素时,构建结构的时间可能超过其益处。哪一个更快,只能通过分析代码来确定
答案 2 :(得分:-1)
您可以使用以下代码提高性能:
var oListBHashSet = new HashSet<Detail>(ListB);
ListA.RemoveAll(v => oListBHashSet.Contains(v));
使用HashSet使包含快速检查,并确保仅对序列进行一次评估。