メンバー値の 1 つをソート用の「メイン」値にするには...
これらのノードが直接比較できるように、IComparable
インターフェイスをクラスに直接実装する必要があります。これにより、このクラスのインスタンスを比較する方法Artist
を制御できます。
これを行うには、基本的に、関心のあるメンバーで比較を実行し、その結果をオブジェクトの比較の結果として返すだけです。
Eg:
class Artist : IComparable
{
/* Your Artist specific implementation here */
private string name;
private int age;
...
/* Implementation of IComparable */
public int CompareTo(object obj)
{
Artist compareToObj = (Artist)obj;
// Comparison by name.
return this.name.CompareTo(compareToObj.name);
// And if you wanted to do the comparison by eg age:
// return this.age.CompareTo(compareToObj.age);
}
}
Regarding your use of a generic node:
I'm not sure why you've made your Artist
class generic - I would assume that an Artist
is not generic as you have known properties etc for an artist.. At least, I can't see that that's of any use in the context of this question. Your BinarySearchTree
implementation should be generic, however, such that it can be a tree of Artist
s, Car
s, Gerbil
s or whatever other Object
you see fit to use in a BST.
ただし、ジェネリックなクラスが必要な場合はMyGenericNode
、任意のタイプのノードを許可します。はい、それをジェネリックにし、指定されたタイプがコードに従って IComparable であることを確認します。しかし、の特定の実装に依存する以外に、 のどMyGenericNode
のメンバーを比較するかを「知る」方法はありません。<T>
<T>
.CompareTo()
「空想的」(読み: 乱雑、複雑、やり過ぎ...) を取得したい場合は、ノード比較が行わ れるメンバーの名前を渡すことができる独自のインターフェイスを作成できると思います。に加えて、新しいインターフェースも実装する必要があります。次に、リフレクションを使用して指定されたメンバーを「検索」し、それを比較します。これを行わないことを強くお勧めします-これを質問への「答え」としてここに置いてください;-)IComparisonMemberSpecifiable
IComparable
<T>
IComparable
MyGenericNode
<T>
しかし実際には、さまざまなクラスのノードを受け入れるためにジェネリックである必要があるのはツリーです。あなたのノードクラスは一般的なIMHOである必要があります/すべきではありません。