C#中LINQ筛选结果无法转换为自定义Questions集合的问题
C#问卷构建器分组类型转换问题解决
问题场景
开发C#问卷构建器时,加载所有问题到自定义集合Questions后,尝试通过LINQ的Where按groupID筛选分组问题,却无法将筛选结果转换为Questions类型,报错:
Unable to cast object of type 'WhereEnumerableIterator`1[MedVerifyPlusFacilities.QuestionnaireHandler+Question]' to type 'Questions'
原代码片段:
private void loadQuestions() { Questions allQuestions = new Questions(); allQuestions.loadQuestionData(questionnaireID, -1); string questionnaireHtml = ""; try { // 获取所有groupID var groupIDs = allQuestions.Select(groups => groups.groupID).Distinct(); foreach (int groupID in groupIDs) { // 根据groupID提取问题子集以构建分组容器 try { Questions groupQuestions = (Questions)allQuestions .Where(questions => questions.groupID == groupID); questionnaireHtml += buildGroup(groupQuestions); } catch (Exception ex) { } } QuestionsContainer.InnerHtml = questionnaireHtml; } catch (Exception ex) { // 显示友好错误信息 } }
问题原因
LINQ的Where方法返回的是WhereEnumerableIterator<Question>类型,这是一个临时枚举器,并非自定义的Questions集合类。直接强制转换会失败,因为两者之间没有继承或显式转换关系。
解决方法
方法1:给Questions类添加支持枚举的构造函数
如果Questions类是基于List<Question>或其他可枚举集合的封装,添加一个接受IEnumerable<Question>参数的构造函数,就能直接将LINQ筛选结果传入创建Questions实例:
public class Questions : List<Question> { public Questions() { } // 新增构造函数,接收枚举类型的问题集合 public Questions(IEnumerable<Question> questions) : base(questions) { } // 原有加载数据方法 public void loadQuestionData(int questionnaireID, int param) { // 你的实现逻辑 } }
修改原代码中的筛选逻辑:
Questions groupQuestions = new Questions(allQuestions.Where(q => q.groupID == groupID));
方法2:手动填充Questions实例
如果不想修改Questions类的构造函数,可以创建新的Questions对象,循环将筛选后的问题添加进去:
Questions groupQuestions = new Questions(); foreach (var question in allQuestions.Where(q => q.groupID == groupID)) { groupQuestions.Add(question); }
方法3:调整buildGroup方法参数类型
如果允许的话,将buildGroup方法的参数类型改为IEnumerable<Question>,无需转换直接传入Where的结果:
// 修改buildGroup方法签名 private string buildGroup(IEnumerable<Question> groupQuestions) { // 原有实现逻辑 } // 调用时直接传入筛选结果 questionnaireHtml += buildGroup(allQuestions.Where(q => q.groupID == groupID));
内容的提问来源于stack exchange,提问作者Josh Montgomery
相关产品推荐
相关产品推荐

