C# Linq使用GroupBy时返回默认空列表而非缺失分组
让GroupBy始终生成包含奇偶分组的列表(缺失分组用空列表填充)
你当前的代码用GroupBy按奇偶分组时,只会生成原数组中存在的分组——比如示例数组全是偶数,结果列表就只有偶数分组,导致取奇数分组时索引越界。之前尝试的x.ToList() ?? new List<int>()没用,因为不存在的分组根本不会被GroupBy输出,这个判断根本不会触发。
下面提供两种解决方法:
方法一:用左连接确保所有分组键都存在
先定义所有需要的分组键(true对应偶数,false对应奇数),再通过左连接把原分组和这些键关联,缺失的分组就用空列表填充:
var x = new int[] { 2, 4, 6, 8, 10 }; // 定义所有必须存在的分组键 var requiredKeys = new[] { true, false }; var y = requiredKeys .GroupJoin( x.GroupBy(num => num % 2 == 0), key => key, group => group.Key, (key, matchingGroups) => matchingGroups.FirstOrDefault()?.ToList() ?? new List<int>() ) .ToList(); // 访问奇数分组:y[1] 是空列表,不会索引越界 var odds = y[1];
方法二:直接筛选生成两个列表(更直观)
如果需求只是固定拆分偶数、奇数列表,不用GroupBy反而更简单,直接两次筛选即可:
var x = new int[] { 2, 4, 6, 8, 10 }; var evenList = x.Where(num => num % 2 == 0).ToList(); var oddList = x.Where(num => num % 2 != 0).ToList(); var y = new List<List<int>> { evenList, oddList }; var odds = y[1]; // 空列表
内容的提问来源于stack exchange,提问作者Preem Palver2
相关产品推荐
相关产品推荐

