2016-11-18 7 views
1

ここにいくつかのコード例を示します。LINQを使用するためにどのようなメソッドをオーバーライドする必要がありますか?

私は自分のクラスを作成しました:

public class MyObject { 
    private string _guid; 
    public int Value; 

    // other stuff here...   

    public MyObject() { 
     _guid = Guid.NewGuid().ToString(); 
    } 
} 

を、私は例えば、私は前に作成され、いくつかのオブジェクトと他のオブジェクトのリストを持っている:

MyObject inputObject = new MyObject(); 
List<MyObject> myObjects = new List<MyObject>(); 

は、私は次のようにそれらを使用します:

myObjects.Where(mo => mo == inputObject).Sum(fo => fo.Value); 

など。 (私は私のリストにはInputObjectと同じGUIDを持つオブジェクトがあることを確信している、これはただのコード例である)

質問は次のとおりです。私はLINQは、検索を使用するにはどうすればよい

、どこに、このリストの合計など?

GUIDで比較するためにどのようなメソッドをオーバーライドする必要がありますか、どのように表示する必要がありますか?

Equals()メソッドでIEquatableを使用する方が良いですか?

+0

を=='オーバーライドする必要性をyou'd '==' -operatorを使うと、 'Equals'に対してチェックすると、そのメソッドをオーバーライドする必要があります。 'Sum'の場合、あなたはすでにデリゲートに集計される値を置くので、オーバーライドする必要はありません。 – HimBromBeere

+0

@HimBromBeereそれでは、どのように正しく上書きする必要がありますか?私はIEquatable をMyObjectに使用する必要がありますか? –

+0

where節がどのように見え、どこのメソッドで呼び出すかによって異なります。これはオーバーライドする方法でなければなりません(そして、このメソッドはMarcが指摘しているものに依存しているかもしれません)。 – HimBromBeere

答えて

2

==にチェックしているので、==演算子(!=演算子を指定する必要があります)を指定する必要があります。それ以外の場合は、参照平等が適用されます(クラスであるため)。同じオブジェクト(同等のもの)である可能性は低いです。

また、Equalsを無効にして、.Equals(注:この場合はGetHashCode()を上書きすることもできます)を使用してテストを変更します。

簡単にオプションは、しかし、すなわち、直接

public string Guid => _guid; 

と関連する内部値をチェックする方法があります:あなたは `をチェックすると

.Where(mo => mo.Guid == inputObject.Guid) 
+0

'IEquatable 'は演算子のオーバーロードよりも優れたオプションでしょうか? 'Equals()'をオーバーライドして 'IEquatable 'の実装を使うことができます。 – toadflakz

+0

@toadflakz OPが '=='を使用して比較したい場合、そのオペレータをオーバーライドする必要があります。このシナリオでは、インターフェイスを実装しても何もしません。 – HimBromBeere

+0

Guidで検索するのが最善の方法です – mayu

関連する問題