5

ジェネリック リストの一番下から重複アイテムを削除しようとしています。私は以下のように定義されたクラスを持っています

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

そして、リストから重複を削除するために IEqualityComparer を実装する別のクラスを定義しました

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

idn6 を保持し、idn1 と idn4 を削除していることを、distinct を使用して確認するにはどうすればよいですか?

4

3 に答える 3

9

ほとんどの LINQ 演算子は順序を保持します: Distinct() の API は、遭遇した各アイテムの最初のインスタンスを取ると述べています。最後のインスタンスが必要な場合は、次のようにします。

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

明示的な比較子を定義する必要を回避する別のオプションは次のとおりです。

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

MSDN から:

IGrouping オブジェクトは、各 IGrouping の最初のキーを生成した source 内の要素の順序に基づく順序で生成されます。グループ内の要素は、ソースに表示される順序で生成されます。

于 2012-10-01T23:59:23.883 に答える
1

カスタム追加メソッドを実装して、最新のレコードを維持することもできます。

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);
于 2012-10-02T00:07:22.160 に答える
0

> 1であるGroupかどうかを確認できますCount

var distinctWorked = !(res
.GroupBy(a => a.Name)
.Select(g => new{g.Key, Count = g.Count()})
.Any(a => a.Count > 1));
于 2012-10-02T00:01:17.333 に答える