4
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" 
}

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

4

2 回答 2

5

试试这个

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

我没有执行查询。

想法是先分组,然后对分组进行排序,然后每个有序组中的第一个。

于 2012-12-18T04:14:34.397 回答
0

使用Distinct方法并编写类的适当实现GetHasCodeEquals方法Person

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方法。

于 2012-12-18T04:17:39.610 回答