2016-03-30 4 views
0

ファイル構造を作成し、このファイル構造を複数のビューモデルのインスタンスで使用する方法があります。この場合、質問または回答の両方に、それぞれが指し示す「ファイル」のリストのインスタンスがあり、各質問/回答がそれ自身のインスタンスを変更できるとしましょう。IEnumerableの複数の列挙が可能です - 複数の列挙が必要な場合はどうすればよいですか?

ここに私のコードの簡略版があります。

public void GeneratVms() 
{ 
    List<IFile> files = _data.GetFiles(); 
    IEnumerable<IFileViewModel> fileVms = _generator.GenerateFileList(originalFileList); 

    MyQuestionController = _generator.GenerateQuestionController(_questions, fileVms); 
    MyAnswerController = _generator.GenerateAnswerController(_answers, fileVms); 
} 

そして質問/回答コントローラジェネレータは、次のようになります。

public IQuestionController GenerateQuestionController(
      List<IQuestion> questions, IEnumerable<IFileViewModel> files) 
{ 
     IEnumerable<IQuestionViewModel> questionVms = 
       questions.Select(q => new QuestionViewModel(q, files)); 

     // Pass through these questions to the controller, and also the 
     // original file list, so the controller can create new instances 
     // of QuestionViewModel which will also have the file structure. 
     return new QuestionController(questionVms, files); 
} 

意図したとおり、それは動作します。このANに問題は現在ありません。しかし、ReSharperは、「可能な複数のIEnumerableの列挙」が存在する可能性があると不平を言います。これは、私が何をやっているのか明白ではないかもしれないと私に信じさせます。

私がリストとしてfileVmsを扱うと、さまざまな質問/回答に渡すすべてのインスタンスは同じものとして扱われるため、好きな場合には "リスト"の独自のバージョンを保持できません。

誰かがより良いソリューションを提供できますか?

答えて

2

fileVmsIEnumerable<T>であるため、この警告が表示されます。このインスタンスがList<T>の場合は実行時タイプですが、ReSharperはこれを前提とすることはできず、したがってメッセージを返します。

ただし、代わりにfileVmsのタイプをList<T>に変更することで、これを回避できます。

あなたの方法がGenerateFileListであるため、警告を無視することもできます。ただし、この実装を検討してください:

public IEnumerable<IFileViewModel> GenerateFileList(originalFileList) { 
    return Enumerable.Range(0, 10).Select(new FileModel)); 
} 

このメソッドは、実際のリストの代わりにイテレータを返します。したがって、戻り値を別のメソッドに2回指定すると、このイテレータも2回繰り返されます。あなたはGenerateQuestionController -method、その後

GenerateAnswerController
IEnumerable<IAnswerViewModel> answerVms = 
    answers.Select(a => new AnswerViewModel(a, files)); 

IEnumerable<IQuestionViewModel> questionVms = 
    questions.Select(q => new QuestionViewModel(q, files)); 

を呼び出すときにyou'll -parameter files倍とGenerateFileListが二倍にも-method実行し、そのために繰り返します。

+0

はい、しかし、私がリストに変更した場合、それは異なった動作をします - インスタンスは接合され、質問のインスタンスがファイルを更新すると、この更新は全面的に反映されます。私はこれが起こることを望んでいない、私はむしろ各質問に各ファイルリストの新しいインスタンスを渡すだろう - したがってそれをIEnumerableに保つ。私の質問は、これをもっと明白にする方法ともっと関係していましたか? – jimbo

+0

@jimbo代わりに 'IList 'を使うのはどうですか?私は再構築なしで得ることができるほど明確であると思います。 –

+0

質問がリスト内のファイルを更新する理由がわかりません。これはどこで起こるのですか?さらに、 'GenerateFileList'は実際に正確に何を返しますか?リストやイテレータ? – HimBromBeere

関連する問題