2017-10-22 21 views
0

私はdllのように必要なときに移動する予定の小さなクラスを作成しています。そのクラスにはさまざまなソートアルゴリズムが用意されています。私は関数がオブジェクトを含むあらゆるタイプのリストで動作するようにしたい。だから、このように、基本的です:2つの一般的な値を比較する最良の方法は?

class TemplateSortings<T> 
{ 
    List<T> GNRList; 

    static void SortBubble<T>() 
    { 
     //Do stuff with GNRList, which can be a list of any values (nums, strings, objects) 
    } 
} 

今、私はトラブルを抱えている質問はこれです - 一般的な2つの値を比較するための最良の方法です:比較演算子をオーバーロードまたはクラスがIComparableインターフェイスを継承しましたの?何が良いの?

答えて

3

どのタイプでも動作させたい場合は、TにはIComparableを実装するタイプに制約しないでください。

これを回避する簡単な方法は、呼び出し元にオブジェクトの比較方法を決定させることです。

static void SortBubble(Func<T, T, int> comparator) 
{ 
    ... 
} 

あなたは2つの引数を持つcomparatorを呼び出すことができ、それはあなたに負の値、0、または最初のパラメータは、より少ない等しい、またはそれ以上であることを示す正の値を与える:あなたは追加のパラメータを必要とします2番目のパラメータよりも

例として、あなたはこのようなSortBubbleintとSを呼び出すことができます。

var sorting = new TemplateSortings<int>(); 
// populate the list... 
sorting.SortBubble((x, y) => x.CompareTo(y)) // pass a lambda 

EDIT:

あなたは余分なパラメータをしたいとメソッド内のタイプをチェックしたくない場合は、それは潜在的に有効な型で作業することができますので、あなたはあなたのコードを一般化でき

if (typeof(IComparable<T>).IsAssignableFrom(typeof(T))) { 
    // do your sorting 
    // you need to cast values of type "T" to "Comparable<T>" like this 
    // var castedValue = (IComparable<T>)tValue; 
} else { 
    throw ... 
} 
+0

少し不安ですが、あなたは思いませんか?私は今どの変数を使うのか知っているかもしれないので、私はリストをGNRListにソートしてソートすることを考えていました。私はそれがどんなタイプになるのかわかりません... – Alucard

+0

それは意味をなさない。あなたはアイテムを並べ替えるかどうか、あるいはコンピュータがどのように知っているかをあなたに伝えなければなりませんか? @Alucard – Sweeper

+0

私は関数自体がリストのタイプをチェックしたかったのです。小数点以下の桁で作業する必要がある場合はどうすればよいですか?別のSortBubble関数を書く必要がありますが、今回はですか?または、関数内の型をチェックするだけですか? @ Sweeper – Alucard

0

:あなたはこのような何かを行うことができます:

public static IEnumerable<T> BubbleSort(
    this IEnumerable<T> source, 
    IComparer<T> comparer == null) 
{ 
    var currentComparer = comparer ?? Comparer<T>.Default; 
    //bubble sort with currentComparator 
} 

場合さて、あなたは、いかなるTを並べ替えることができます。

  1. TIComparable<T>
  2. TあなたはTを比較する方法を知っているComparatorを伝承遺産IComparable
  3. を実装して実装s

最初の比較を実行しようとすると、それ以外のシナリオでは失敗します。

関連する問題