2009-07-22 13 views
2

.NET用の汎用コレクションアルゴリズムのライブラリはありますか? itemsがそうでなければ私は単にList<T>.SortList<T>.BinarySearchメソッドを使用することができ、List<T>ではないことをC#の汎用コレクションアルゴリズム

IList<T> items = GetItemsFromSomeWhere(); 
Algorithms<T>.Sort(items); 
// 
// .... 
// 
T item = GetItemSomwHow(); 
int i = Algorithms<T>.IndexOf(items, item); 

注:私はこのような何かを書くことができるようにしたいと思います。

もちろん、私はそれらを自分で実装することができますが、私はその輪を再構築したくありません。

私は効率的な実装をしたいと思います。

P.S.

使用するコレクションについてはアドバイスしないでください。私はArrayまたはList<T>の能力を完全に認識しています。私が必要とするのは、IList<T>ベースのコレクションで動作するアルゴリズムのライブラリです。

編集: 私が必要としていたものを見つけました - 私自身の答えを見てください。

+1

皆さん、他に何もする必要はありませんか? – mark

答えて

1

いくつかの研究を行った後、私はWintellectからPowerCollectionsライブラリを発見しました。

は別に、様々なコレクションを供給するから、任意IList<T>を期待BinarySearch<T>SortInPlace<T>含むかなりの数のアルゴリズム、静的Algorithmsクラスを提供します。

1

System.Linq.Enumerable class良いものがたくさんあります。確かに、それはいくつかのものを欠場しますが、それにもかかわらず適用されます。

+2

いいえ。バイナリ検索を行わない – SLaks

+0

バイナリ検索は、インデックスベースのアクセス時間がO(1)のリストでのみ有効です。 'Array.BinarySearch'は配列のためにそれを行います。 –

+0

Guys、私はリストまたはT []ではなく、IList を持っています。任意のIList ベースのコレクションのソリューションが必要です。では、Array.BinarySearchがどのように私を助けているのですか? – mark

0

Arrayクラスがあなたのために機能するかもしれません(SortIndexOf)。

は、次のことを行うことができます:

 IList<string> foo = new List<string>(); 
     foo.Add("hi"); 
     foo.Add("bye"); 
     string[] foo_temp = new string[foo.Count]; 
     foo.CopyTo(foo_temp, 0); 
     Array.Sort<String>(foo_temp); 
     foo = new List<string>(foo_temp); 
+0

私は、質問者が、どのコレクションを使うべきかアドバイスを求めるのではなく、一般的なコレクションを扱うアルゴリズムを探していると思います。 –

+0

いいえ。配列に対してのみ機能します。彼は 'IList ' – SLaks

+0

Array.BinarySearch SwDevMan81

0

は、あなただけのOrderBy拡張メソッドでLINQの定義を与えました。

+0

いいえ。彼はインプレースを並べ替えることを望んでいる – SLaks

+0

私はソートは単なる例だと思う - LINQにはコレクション操作機能がたくさんあるが、彼は他のものに興味があると思う。私は交差点、組合などを行うSet の実装を見てきましたが、彼が望んでいるかどうかはわかりません。 – n8wrl

0

IndexOfKey SortedList <のメソッドは内部的にBinarySearchを行います。

2

残念ながら、.NETはIList<T>インターフェイスで動作する組み込みのBinarySearch実装を提供していません。

他のポスターと同様に、一般的なリストの並べ替えにLinqを使用できます。しかし、IList<T>のバイナリ検索では、check out the following SO postをお勧めします。

私はLinqのギャップを埋めるために使うことができる、良い汎用汎用アルゴリズムライブラリを知らないのですが、多くの人が同様の問題を解決するために独自のユーティリティを実装していると思われます。

+0

自分の答えをチェックしてください。 – mark

0

使用しているデータ構造と、実際に使用できるアルゴリズムについて考えてみましょう。私はあなたがコレクションについて読んでみたくないのは分かっていますが、明らかにバイナリ検索はリンクリストでは動作しません。どのような種類のアルゴリズムが必要ですか?効率的なソートアルゴリズムはすでに存在します。 Linqと.NETコレクションは必要なものすべてを提供するはずです。

+0

いいえ、彼は特にIListアルゴリズムを望んでおり、彼が与えた2つの例はBCLのIListに実装できますが、現在はそうではありません。それらはListとArrayに関連付けられています。 –

0

この問題も発生しました。私の解決策は、を使用して、List.SortArray.BinarySearchの実装を見つけて、IList<T>の拡張メソッドとして書き直すことでした。

拡張機能としてではなく、通常の静的メソッド(例:

Algorithms<T>.Sort(items); 

は普通の静的(非ジェネリック)クラスAlgorithmsに、静的ジェネリックメソッドSortを行い、型推論が行います:あなたはC#2)を使用している場合、あなたはあなたの正確な構文は必要ありません。引数の型を見て、残りは:

Algorithms.Sort(items); 
+0

私自身の答えをチェックしてください。 – mark

1

あなたはテンプレートとして、このライブラリを使用することができます:Generic Sorting Library

それはまだ進行中の作業であり、すべてのソートアルゴリズムが含まれていません。ただし、テンプレートとして使用して構築することができます。

IList上の拡張メソッドとしてsort()を公開しており、ソートアルゴリズムと比較者を指定する必要があります。あなたのコードは次のように書くことができます:

  int[] sortingArray = { 12, 5, 2, 7, 66 }; 
      IComparer<int> comparer = new SortComparer(); 
      sortingArray.Sort(SortStrategy.HeapSort, comparer); 

これが役立つかどうか教えてください。

関連する問題