我有一个名为“国家/地区”的列表,每个国家/地区都有一个“城镇”列表,其中包含“街道”列表。一条街上有许多房屋。列表中的列表中列出。非常简单。
我需要生成位于名称以字母“A”开头的国家/地区的房屋列表。这不是一个非常合乎逻辑的例子,但它比我正在处理的更复杂的结构更容易解释。
当然,这不是太复杂,可以通过创建一个List然后ForEaching所有countries.Where(Name.StartsWith('A')),然后ForEaching所有城镇,最后添加该镇的每条街道来完成到列表。
我不喜欢那种方法,所以我想要更漂亮的东西......
可以通过在Countries.Where()列表中使用像Aggregate这样的东西吗?如果是这样,怎么样? (因此,在一个声明中。)
是的,选择将仅在顶部列表中,因此应该更容易。
答案 0 :(得分:2)
这看起来像是Enumerable.SelectMany的作业(它允许你取消组合一级层次结构):
List<County> countyList = GetCounties();
IEnumerable<County> aCounties = countyList
.Where(c => c.Name.StartsWith("A"));
List<House> aCountyHouses = aCounties
.SelectMany(c => c.Towns)
.SelectMany(t => t.Streets)
.SelectMany(s => s.Houses)
.ToList();