如何过滤List<List<string>>并保留存在于指定列表中的元素
解决C#嵌套列表元素过滤问题
我有如下C#代码:
var l = new List<List<string>>() { {"a","b","c"}, {"d","g","f"} }; var tokeep = new List<string>() { "a","c","d" };
我想要过滤集合l,仅保留每个子列表中存在于tokeep列表里的元素,尝试了以下代码但无法正常运行:
l = l.Where(s => s.Where(s => tokeep.Contains(s)).ToList()).ToList();
期望得到的结果为:l = { {"a","c"}, {"d"} }
你的代码问题出在外层Where的逻辑上:Where方法需要传入返回bool值的判断条件,但你返回的是过滤后的子列表(List<string>类型),这会导致编译错误。
正确的做法是遍历每个子列表,单独过滤其中的元素,再将过滤后的子列表重新组合成新列表,用Select就能实现:
l = l.Select(sublist => sublist.Where(item => tokeep.Contains(item)).ToList()).ToList();
如果需要剔除过滤后为空的子列表(比如某个子列表的元素全不在tokeep中),可以额外加一层Where判断:
l = l.Select(sublist => sublist.Where(item => tokeep.Contains(item)).ToList()) .Where(filteredList => filteredList.Any()) .ToList();
内容的提问来源于stack exchange,提问作者Nicolas REY
相关产品推荐
相关产品推荐

