如何在Linq中对IEnumerable类型问卷数据按GroupBy分组并操作
用Linq GroupBy处理问卷分组数据
1. 先明确实体类和数据示例
假设你的问卷问题实体类结构如下:
public class Question { public int Id { get; set; } public string Content { get; set; } public string GroupByField { get; set; } // 用于分组的字段,比如"个人信息""偏好设置" public string QuestionType { get; set; } // 问题类型,比如单选、多选 }
从JSON反序列化后得到的问卷数据列表示例:
var questions = new List<Question> { new Question { Id = 1, Content = "你的年龄?", GroupByField = "个人信息", QuestionType = "单选" }, new Question { Id = 2, Content = "你的职业?", GroupByField = "个人信息", QuestionType = "单选" }, new Question { Id = 3, Content = "你常用的APP?", GroupByField = "偏好设置", QuestionType = "多选" }, new Question { Id = 4, Content = "你喜欢的内容类型?", GroupByField = "偏好设置", QuestionType = "多选" }, new Question { Id = 5, Content = "你的性别?", GroupByField = "个人信息", QuestionType = "单选" } };
2. 用GroupBy进行分组
Linq的GroupBy方法可以直接按指定字段分组,返回的集合中每个元素是一个分组,包含分组键和该组下的所有问题:
// 按GroupByField字段完成分组 var groupedQuestions = questions.GroupBy(q => q.GroupByField);
3. 遍历分组并展示内容
分组后用foreach遍历,输出每个分组的名称及下属问题:
foreach (var group in groupedQuestions) { Console.WriteLine($"--- 分组:{group.Key} ---"); // 遍历当前分组下的所有问题 foreach (var question in group) { Console.WriteLine($"问题{question.Id}:{question.Content}(类型:{question.QuestionType})"); } Console.WriteLine(); }
运行后输出结果:
--- 分组:个人信息 --- 问题1:你的年龄?(类型:单选) 问题2:你的职业?(类型:单选) 问题5:你的性别?(类型:单选) --- 分组:偏好设置 --- 问题3:你常用的APP?(类型:多选) 问题4:你喜欢的内容类型?(类型:多选)
4. 对分组内的问题进行操作
分组后还能针对每组数据做各种Linq操作,举几个常用场景:
- 统计每组问题数量:
var groupCount = groupedQuestions.Select(g => new { GroupName = g.Key, QuestionCount = g.Count() }); // 输出统计结果 foreach (var item in groupCount) { Console.WriteLine($"分组「{item.GroupName}」共有{item.QuestionCount}个问题"); }
- 筛选分组内的特定类型问题:
比如只保留每组里的单选问题:
var singleChoiceGroups = groupedQuestions.Select(g => new { GroupName = g.Key, SingleChoiceQuestions = g.Where(q => q.QuestionType == "单选").ToList() });
- 对分组内的问题按ID排序:
var sortedGroups = groupedQuestions.Select(g => new { GroupName = g.Key, SortedQuestions = g.OrderBy(q => q.Id).ToList() });
注意点
- 如果你的原始数据是JSON字符串,需要先用
JsonSerializer(System.Text.Json)或Newtonsoft.Json反序列化成List<Question>,才能用Linq操作。 GroupBy返回的是IGrouping<TKey, TElement>类型,每个分组的Key就是你用来分组的字段值,分组本身可直接遍历获取内部元素。
内容的提问来源于stack exchange,提问作者Venkat
相关产品推荐
相关产品推荐

