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));