从通用列表底部删除重复项

Ala*_*n B 5 c# linq generics

我试图从通用列表的底部删除重复项.我的课程定义如下

public class Identifier
{
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我已经定义了另一个实现IEqualityComparer的类来从List中删除重复项

public class DistinctIdentifierComparer : IEqualityComparer<Identifier>
{
    public bool Equals(Identifier x, Identifier y)
    {
        return x.Name == y.Name;
    }

    public int GetHashCode(Identifier obj)
    {
        return obj.Name.GetHashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我正在尝试删除旧项目并保持最新状态.例如,如果我有如下定义的标识符列表

Identifier idn1 = new Identifier { Name = "X" };
Identifier idn2 = new Identifier { Name = "Y" };
Identifier idn3 = new Identifier { Name = "Z" };
Identifier idn4 = new Identifier { Name = "X" };
Identifier idn5 = new Identifier { Name = "P" };
Identifier idn6 = new Identifier { Name = "X" };

List<Identifier> list =  new List<Identifier>();
list.Add(idn1);
list.Add(idn2);
list.Add(idn3);
list.Add(idn4);
list.Add(idn5);
list.Add(idn6);
Run Code Online (Sandbox Code Playgroud)

我已经实施了

var res = list.Distinct(new DistinctIdentifierComparer());
Run Code Online (Sandbox Code Playgroud)

我如何确保使用distinct我保持idn6并删除idn1和idn4?

Cha*_*ion 9

大多数LINQ运算符都是保持顺序的:Distinct()的API表示它会占用它遇到的每个项目的第一个实例.如果你想要最后一个实例,只需:

var res = list.Reverse().Distinct(new DistinctIdentifierComparer());
Run Code Online (Sandbox Code Playgroud)

另一个避免必须定义显式比较器的选项是:

var res = list.GroupBy(i => i.Name).Select(g => g.Last());
Run Code Online (Sandbox Code Playgroud)

来自MSDN:

基于源中产生每个IGroup的第一个键的元素的顺序,顺序产生IGrouping对象.分组中的元素按它们在源中出现的顺序生成.