C# IEnumerable的可能多重枚举-如果我需要多重枚举怎么办?

C# IEnumerable的可能多重枚举-如果我需要多重枚举怎么办?,c#,list,resharper,ienumerable,multiple-instances,C#,List,Resharper,Ienumerable,Multiple Instances,我有一个创建文件结构的方法,并在视图模型的多个实例中使用此文件结构。所以在这种情况下,假设一个问题或答案都有一个指向的“文件”列表的实例,每个问题/答案都可以修改它自己的实例 这是我的代码的简化版本 public void GeneratVms() { List<IFile> files = _data.GetFiles(); IEnumerable<IFileViewModel> fileVms = _generator.GenerateFileList(o

我有一个创建文件结构的方法,并在视图模型的多个实例中使用此文件结构。所以在这种情况下,假设一个问题或答案都有一个指向的“文件”列表的实例,每个问题/答案都可以修改它自己的实例

这是我的代码的简化版本

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 void generativms()
{
列表文件=_data.GetFiles();
IEnumerable fileVms=_generator.GenerateFileList(原始文件列表);
MyQuestionController=\u generator.GenerateQuestionController(\u问题,FileVM);
MyAnswerController=\u generator.GenerateAnswerController(\u 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); 
}
public IQuestionController GenerateQuestionController(
列出问题,IEnumerable文件)
{
IEnumerable questionVms=
选择(q=>NewQuestionViewModel(q,文件));
//将这些问题传递给控制员,以及
//原始文件列表,以便控制器可以创建新实例
//也将具有文件结构的QuestionViewModel。
返回新的QuestionController(QuestionVM、文件);
}
目前,该系统没有任何问题,它可以按预期工作。然而,ReSharper抱怨说可能存在“IEnumerable的多个枚举”。这让我相信,也许我对自己所做的事情并不明确

如果我将filevm作为一个列表来处理,那么我传递给各种问题/答案的每个实例都会被视为相同的,因此如果您愿意的话,它们不能保留自己独特的“列表”版本


有谁能提供更好的解决方案吗?

出现此警告是因为
fileVms
是一个
IEnumerable
。尽管此实例的运行时类型可能是
List
ReSharper,但它不能对此做出任何假设,因此返回消息

但是,您可以通过将
fileVms
的类型改为
List
来避免这种情况

作为方法
GenerateFileList
,您也可以忽略警告。然而,考虑这种实现:

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

GenerateAnswerController
中,您将迭代
files
-参数两次,并因此运行
GenerateFileList
-方法两次。

是的,但如果我将filevm更改为列表,则其行为会有所不同-实例被固定,并且当问题的实例更新文件时,这一更新贯穿始终。我不希望发生这种情况,我宁愿将每个文件列表的一个新实例传递给每个问题,从而使其保持IEnumerable。我的问题更多的是关于我如何使它更明确?@jimbo不如改用
IList
?我认为这是不需要重新设计就可以做到的最明确的问题。我不明白为什么一个问题应该更新列表中的文件。这在哪里发生?此外:
GenerateFileList
实际返回什么?列表还是迭代器?IList不会引起同样的问题吗?GenerateFileList返回一个IEnumerable。实际上,我希望一个“问题”(etc)能够修改单个文件列表——随意更新那些IFileViewModel项——而不会影响同一IFileViewModel在另一个问题列表中的状态。如果实际列表可能在这段时间内发生变化,您当然需要重新迭代列表。在这种情况下,您可以忽略警告,也可以使用注释抑制警告,因为这是预期行为。
IEnumerable<IQuestionViewModel> questionVms = 
    questions.Select(q => new QuestionViewModel(q, files));
IEnumerable<IAnswerViewModel> answerVms = 
    answers.Select(a => new AnswerViewModel(a, files));