2009-07-13 5 views
5

私は複数のフィールドでカスタムコレクションを並べ替えるために、拡張メソッドOrderByとThenByを使用しています。このソートはコレクションには影響しませんが、代わりにIEnumberableを返します。 IEnumerableの結果をカスタムコレクションにキャストできません。とにかく、私のコレクションの順序を変更するか、IEnumerableの結果を私のカスタムコレクションに変換する必要はありますか?IEnumerableをC#のカスタムタイプに変換するにはどうすればよいですか?

答えて

6

あなたのコレクション型はIList<T>を実装している場合(それにAdd()ことができるように)あなたが拡張メソッドを書くことができます:

public static Extensions 
{ 
    public static TColl ToTypedCollection<TColl, T>(this IEnumerable ien) 
     where TColl : IList<T>, new() 
    { 
     TColl collection = new TColl(); 

     foreach (var item in ien) 
     { 
      collection.Add((T) item); 
     } 

     return collection; 
    } 
} 
+0

優秀、ありがとうございます! –

+0

このアイデアは私を完全に助けました。ありがとう! – jeremcc

+0

その面白い、私は同じ質問をした、同じ答えで来て、それを行うより良い方法があるかどうかを見て周りにまだ... – Nevyn

1

いいえありません。クエリ演算子を使用すると、元のコレクションのインスタンスを使用して列挙が生成されません。むしろ、この機能を提供するためにプライベートな実装(おそらく匿名、おそらくそうではない)を使用します。

元のコレクションに入れたい場合は、IEnumerable<T>(またはコレクションが特定のものであればコレクションに格納されているもの)を取り、そのコンストラクタにクエリを渡すタイプのコンストラクタを用意する必要があります。

これを使用してIEnumerable<T>の拡張メソッドを作成し、To<YourCollectionType>とします。これはIEnumerable<T>になり、タイプのコンストラクタに渡して返します。

+0

またはキャスティングオペレーターは、このケースではより良いようです。 – Dykam

+0

Typo:キャスティングオペレータ – Dykam

1

いいえToListとToDictionary拡張メソッドで設定されたパターンに従うことができます。同様の拡張メソッドを記述して、独自のコレクションタイプをIEnumerableからロードします。

0

カスタム収集をソートできるように、IComparerの独自のインスタンスを作成できます。

ブルートフォースIEnumerableをループし、各アイテムをカスタムコレクションの新しいインスタンスにダンプすることができます。

0

あなたはIEnumerableをして、リストを初期化することができます。

項目はタイプIEnumerableをである場合、あなたはこのようなリストを作成することができます

var list = new List<string>(items); 

またはあなたは、単に(items.ToListを呼び出すことができますが)

var list = items.ToList(); 
0

カスタムコレクションはどのインターフェイスを実装していますか?

その場合のIListは、あなたがそのがIDictionaryのは、あなたがIEnumerableを その他、各種上.ToDictionary()を行うことができるだろうとした場合のIEnumerable に.ToList()を行うことができると思います。..

これはあなたのためにより実行可能なものに持って来る。

何も似ていない場合は、IEnumerableの拡張メソッドを.ToMyCollection()に書き込むことができます。

0

エナメルテーブルとコレクションはかなり異なる獣です。

列挙型では、コレクションにインデックスベースのアクセサ、Countプロパティなどがある間だけ列挙できます。コレクションを作成するには、実際にはIEnumerableを列挙する必要があります。リスト<T>のような典型的なコレクションには、IEnumerableを受け入れるコンストラクタがあります。それにもかかわらず、列挙が実行されます。

0

System.Linq。列挙クラスあなたがこのアプローチに従うと、カスタムコレクションに変換する独自の拡張メソッドを作成することができ

var myEnumerable = this.GetEnumerator(); 

var array = myEnumerable.ToArray(); 
var list myEnumerable.ToList(); 

あなたがいずれかの配列にあなたのIEnumerableタイプを変換するaloowますいくつかの拡張メソッド、ToListメソッドがあります

public static CustomCollection<TSource> ToCustomCollection<TSource>(this IEnumerable<TSource> source); 
0

LINQは、このようなソースコレクションを変更不可能なものとして扱うので、クールです。変更しないからです。拡張メソッドを使用すると、指定した別の順序で列挙されます。このように新しいカスタムリストを作成するわけではありません。

私は2つの選択肢を示唆している:カスタムコレクションにソート機能を実装(またはとして素敵なソート可能なジェネリックコレクションを使用し、自分自身があなたのLINQ-INGの

  • の結果に基づいて、新しいリストを作成

    1. をベース)であるので、インプレースでソートすることができます。
  • 0

    あなたが本当にすべてでカスタムコレクション型を必要ですか?これでやりたいことは、既存の汎用コレクション型によって提供されているように思えますし、拡張メソッドを追加するだけで済みます。

    関連する問題