如何删除列表项与相同类型的其他列表项进行比较

时间:2014-02-11 15:54:08

标签: 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; }
}

我有两个详细信息类型列表:ListA&amp;数组listB。

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

3 个答案:

答案 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使包含快速检查,并确保仅对序列进行一次评估。