簡體   English   中英

從通用列表底部刪除重復項

[英]Removing Duplicates from bottom of Generic List

我試圖從通用列表的底部刪除重復項。 我的課程定義如下

public class Identifier
{
    public string Name { get; set; }
}

我已經定義了另一個實現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();
    }
}

但是,我正在嘗試刪除舊項目並保持最新狀態。 例如,如果我有如下定義的標識符列表

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);

我已經實施了

var res = list.Distinct(new DistinctIdentifierComparer());

我如何確保使用distinct我保持idn6並刪除idn1和idn4?

大多數LINQ運算符都是保持順序的 :Distinct()的API表示它會占用它遇到的每個項目的第一個實例。 如果你想要最后一個實例,只需:

var res = list.Reverse().Distinct(new DistinctIdentifierComparer());

另一個避免必須定義顯式比較器的選項是:

var res = list.GroupBy(i => i.Name).Select(g => g.Last());

來自MSDN:

基於源中產生每個IGroup的第一個鍵的元素的順序,順序產生IGrouping對象。 分組中的元素按它們在源中出現的順序生成。

您還可以實現自定義添加方法來維護最新記錄:

public class IdentifierList : List<Identifier>
{
    public void Add(Identifier item)
    {
        this.RemoveAll(x => x.Name == item.Name);
        base.Add(item);
    }
}

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

IdentifierList list = new IdentifierList ();
list.Add(idn1);
list.Add(idn2);
list.Add(idn3);
list.Add(idn4);
list.Add(idn5);
list.Add(idn6);

您可以Group並檢查是否有任何Count > 1

var distinctWorked = !(res
.GroupBy(a => a.Name)
.Select(g => new{g.Key, Count = g.Count()})
.Any(a => a.Count > 1));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM