2016-05-20 11 views
4

カスタム等価比較元を使用してリストから重複を削除しようとしていますが、それを正しく取得できないようです。リストのユニーク化(C#)

簡体例:

class A 
{ 
    public A(string Test) { this.Test = Test; } 
    public string Test; 
    public string ToString() { return Test; } 
} 

class AsComparer: EqualityComparer<A> 
{ 
    public override bool Equals(A x, A y) 
    { 
     return (x.Test == y.Test); 
    } 

    public override int GetHashCode(A obj) 
    { 
     return obj.Test.GetHashCode(); 
    } 
} 

static private void Test() 
{ 
    var As = new List<A> { new A("Test1"), new A("Test3"), new A("Test1"), new A("Test2") }; 
    As.Distinct(new AsComparer()); 
    As.Sort((e1, e2) => { return (e1.Test.CompareTo(e2.Test)); }); 
} 

これは、コレクション "のTest1"、 "Test1を"、 "Test2を"、 "Test3は" を返します。私は「Test1」が1つしかないようにしたいが、これをどうやって行うのか分からないようだ。

アイデア?

答えて

6

DistinctIEnumerable<T>を返します。ソースリスト自体は動作しません。

As = As.Distinct(new AsComparer()).ToList() 

あなたはまた、あなたがここに仕分け含めることができます:あなたが行う必要があるでしょう

As = As 
    .Distinct(new AsComparer()) 
    .OrderBy(x => x.Test) 
    .ToList() 
+0

これは私が逃したものです!もちろん!ありがとうございました! – Athena

5

Distinct()が返されますので、ブランドの新しいIEnumerable、:

var result = 
    As. 
    Distinct(new AsComparer()). 
    OrderBy(e => e.Test). 
    ToList(); 
+0

'Sort'は' List 'のメソッドなので、' IEnumerable 'で呼び出すことはできません。また、 'Sort'はvoidを返します:https://msdn.microsoft.com/en-us/library/b0zbh7b6(v=vs.110).aspx - Linqの等価物は' OrderBy'です: 'As.Distinct(new AsComparer ())。OrderBy(x => x.Test).ToList() ' –

+0

@HenrikIlgen私は何を考えていましたか?ありがとう、固定! –

1

私はそれが良いことだと思いますあなたのクラスでIEquatableを利用するには

次にできるのは

var result = As.Distinct().OrderBy(x => x.Test).ToList(); 
+0

これは、2つの 'A'が' Test'プロパティが同じ場合(常に正しい場合)、または 'Test'に等しい2つの' A'がいくつかのケースでは同等と見なされます(その場合、適切な 'EqualityComparer'を使う方が良いでしょう)。 –

+0

@HenrikIlgenあなたは正しいですか?質問に記載されたサンプルクラスに従ってコードを投稿しました。 – DotNetDev

関連する問題