比较同一列表中的多个项目

时间:2012-12-18 04:10:42

标签: c# .net linq list compare

List<Person> PList = new List<Person>();

PList.Add(new Person{ Name = "Bob", email = "Bob.b@blah.org" });

基本上这会保存文件中的重复行

我想弄清楚的是如何删除多少,直到列表中每个人只有一个实例。

我最初的想法是使用for循环来运行并基于比较删除

for (int i = 0; i < List.length; i++)
{
    if (PList.position(i).name == PList.position(i++).name)
      if (PList.position(i).date is < PList.position(i++).date)
        "Then I will delete number 1" 
}

但是,我想知道是否有更好或更简单的方法来做到这一点?

2 个答案:

答案 0 :(得分:5)

试试这个

PList = PList.GroupBy (x => x.Name).SelectMany (x=>x.OrderBy(y=> y.Date).Take(1))

我还没有执行查询。

首先是group,然后是order在每个有序群组的take之后的分组。

答案 1 :(得分:0)

使用Distinct方法并编写GetHasCode类的EqualsPerson方法的相应实现。

public class Person : IEquatable<Person>
{
    public string Name { get; set; }

    public string Email { get; set; }

    public override bool Equals(object obj)
    {
        if (obj == null)
        {
            return false;
        }

        if (obj.GetType() != GetType())
        {
            return false;
        }

        return Equals((Person)obj);
    }

    public override int GetHashCode()
    {
        unchecked
        {    
            var hash = 17;

            hash = hash * 23 + (Name == null ? 0 : Name.GetHashCode());
            hash = hash * 23 + (Email == null ? 0 : Email.GetHashCode());

            return hash;
        }
    }

    public bool Equals(Person other)
    {
        if (other == null)
        {
            return false;
        }

        return Name == other.Name && Email == other.Email;
    }
}

然后调用Enumerable.Distinct方法。