2009-07-15 28 views
1

私はクラスユーザーを持っており、同じユーザークラス - ユーザー用のコレクションも実装しています。ユーザーはユーザーオブジェクトを格納します。ユーザーコレクションクラスは、ジェネリックコレクションクラス - コレクションを実装します。オブジェクトへのLINQのクエリ結果のキャスト

私はLINQクエリ結果をコレクションクラスのユーザーのオブジェクトにキャストしたいと考えています。私は明示的なキャストを試みるたびに、それは私にクラスの実行時例外を与えることができません。

私はユーザーコレクションクラスでもiEnumerableインターフェイスを実装しようとしましたが、依然としてクエリ結果をキャストできませんでした。

これで、クエリ結果セット内でforループを実行し、独自のカスタムコレクションユーザーを埋めなければなりません。

アドバイスで、これについて、私は助けてください。 Sanjay Sachdev

+1

あなたはどの言語で作業していますか? – epotter

答えて

2

IEnumerableをパラメータとして受け取り、ループをカプセル化するコンストラクタをコレクションクラスに作成しないでください。私が示唆されてるものを見るために、コンソールアプリでこれを試してみてください - あなたのケースでは、あなたがコレクションをやっているだろう - 私はちょうど例を作成を容易にするためにint型を使用し...

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyCollection myCollection = new MyCollection(Enumerable.Range(1, 10)); 

     foreach (var item in myCollection) 
     { 
      Console.WriteLine(item); 
     } 
    } 
} 

public class MyCollection : Collection<int> 
{ 
    public MyCollection(IEnumerable<int> input) 
    { 
     foreach (var item in input) 
     { 
      this.Add(item); 
     } 
    } 
} 

ます。また、作成することができますそれが簡単に使用できるようにする拡張メソッド...

public static class MyCollectionHelper 
{ 
    public static MyCollection ToMyCollection(this IEnumerable<int> input) 
    { 
     return new MyCollection(input); 
    } 
} 

、その後、あなたはこのようにそれを呼びたい...

MyCollection myCollection = Enumerable.Range(1,10).ToMyCollection(); 
+0

+1 - リスト()から派生している場合は、このコンストラクタを無料で取得します。特殊なコレクションタイプが必要な場合でも考慮する価値があります。コレクションに特別な状態がない場合は、代わりにIEnumerable で拡張メソッドを使用することを検討できます。 – dahlbyk

+0

注 - 私はむしろコレクション以上のリストから継承したいと思います... –

0

あなたはそれが何かにISNにオブジェクトをキャストすることはできませんたとえ両方とも同じinteを実装していても顔。

たとえば、の場合は、配列をキャストすることはできませんが、どちらもIEnumerable<int>を実装しています。どちらかをインターフェイスにキャストできますが、オブジェクトの実際のタイプは変更されません。配列は依然として配列であり、リストにすることはできません。

したがって、結果をループして各アイテムをコレクションに入れなければなりません。

LINQクエリの結果である場合、結果をループする別の理由があります。クエリが返すのは、結果が完成したコレクションではなく、ループしたときに結果を作成するオブジェクトです。だから、あなたがそれをループする前に結果は存在しません。

1

質問から必要なものは100%明確ではありませんが、Cast拡張メソッドを試しましたか?

関連する問題