C#中如何从List<Food>高效获取List<Meat>类型的子列表?
解决List转List的简洁高效方法
嗨,这个问题我太有共鸣了!手动写foreach逐个强制转换确实麻烦,.NET的LINQ早就为我们准备了更优雅的解决方案,不用自己造轮子。
这里有两种常用的方法,根据你的需求选就行:
1. 直接用OfType<T>()一步到位
这个方法是最省心的,它会自动筛选出集合中属于指定类型的元素,同时直接返回IEnumerable<T>类型的结果,最后调用ToList()就能得到List<Meat>:
List<Food> allTheFood = GetListOfFood(); List<Meat> justTheMeats = allTheFood.OfType<Meat>().ToList();
这个方法相当于把你原来的Where(x => x is Meat)和后续的类型转换合并成了一步,而且更安全——如果集合里有非Meat类型的元素,它会直接跳过,不会抛出异常。
2. 先用Where筛选再用Cast<T>()转换
如果你已经通过Where条件确保了筛选后的元素都是Meat类型(比如你的判断逻辑比单纯的类型检查更复杂),可以用Cast<T>()来直接转换整个集合:
List<Food> allTheFood = GetListOfFood(); List<Meat> justTheMeats = allTheFood.Where(x => x is Meat).Cast<Meat>().ToList();
⚠️ 注意:如果筛选后的集合里存在非Meat类型的元素,Cast<T>()会抛出InvalidCastException,所以只有当你100%确定元素类型时才用这个方法,否则优先选OfType<T>()。
额外提示
别忘了在代码文件顶部引用System.Linq命名空间,不然这些LINQ方法都用不了哦:
using System.Linq;
这两种方法的效率和你手动写foreach差不多,但代码简洁度和可读性提升太多了,日常开发中我几乎都是用这些LINQ方法来处理这类类型转换+筛选的场景。
内容的提问来源于stack exchange,提问作者Kieran
相关产品推荐
相关产品推荐

