如何使用LINQ从多国家宗教嵌套列表中提取去重项
代码问题根因与修正方案
现有逻辑的核心错误
- 你当前的LINQ链路完全偏离了“提取单条不重复宗教”的目标:
Select(r => new { r.Religions })的作用是为每个国家对象生成一个打包了整份宗教列表的匿名类型,根本没有把所有宗教条目拆成单个字符串的序列。后续的Distinct()实际是在去重“内容完全相同的整份宗教列表”,而非去重单个宗教项。 - 最终输出环节的问题:你遍历的集合元素是带
List<string>属性的匿名对象,直接调用Console.WriteLine(rel)会触发匿名类型的默认ToString实现,只会输出类似{ Religions = System.Collections.Generic.List'1[System.String] }的类型占位文本,根本不会显示实际的宗教字符串内容。
匹配你现有测试数据的实际运行效果:委内瑞拉和巴拉圭的宗教列表完全一致,会被判定为同一个匿名对象;秘鲁、玻利维亚的列表内容不同会被保留,最终集合里只会剩3个匿名对象,完全不是你要的单个宗教条目集合。
正确实现方式
核心改动点:把原来的单层Select换成SelectMany做列表拍平,直接在字符串序列上做去重,输出时直接打印每个字符串值:
static void AllReligions(List<Country> countries) { // 1. 用SelectMany把所有国家的宗教列表拍平为单个连续的宗教字符串序列 // 2. 直接调用Distinct做字符串值去重,无需自定义比较逻辑 // 3. 可选加排序让输出结果更规整 var distinctReligions = countries .SelectMany(country => country.Religions) .Distinct() .OrderBy(religion => religion) .ToList(); Console.WriteLine("Religions in South America:"); foreach (var religion in distinctReligions) { Console.WriteLine($"- {religion}"); } }
按照你提供的测试国家数据,修正后会正确输出3个不重复的宗教项:
- Roman Catholic
- Protestant
- Evangelical
内容的提问来源于stack exchange,提问作者TheGoogles
相关产品推荐
相关产品推荐

