You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:40:33