LINQ Select调用返回指定类型方法生成新列表未生效问题求助
问题原因
你碰到的是LINQ的**延迟执行(Deferred Execution)**特性:
- 调用
Select()、Where()这类LINQ方法时,不会立刻执行你传入的委托逻辑,只会返回一个封装了计算规则的可迭代对象(IEnumerable<T>) - 只有当你实际遍历这个可迭代对象时(比如用
foreach循环、调用ToList()/ToArray()等聚合方法),对应的映射/过滤逻辑才会逐个作用在源序列元素上
你的代码里既没有遍历strings对象,也没有调用即时执行的方法,仅调用了ToString()——IEnumerable的默认ToString()实现只会输出对象的类型名称,完全不会触发迭代,因此GetStrings方法从未被调用,你也拿不到预期的映射结果。
另外你代码里的AsEnumerable()是冗余调用,List<string>本身已经实现了IEnumerable<string>接口,不需要额外转换。
修复方案
主动触发LINQ逻辑的执行即可,两种常用实现方式:
- 直接遍历
IEnumerable对象,遍历过程中自动执行映射逻辑 - 调用
ToList()/ToArray()方法,立刻执行所有映射逻辑,将结果转为实体集合
修正后的可运行代码示例:
namespace mytests{ class program { static void Main (string[] args) { List<string> nums = new List<string>(); nums.Add("999"); nums.Add("888"); nums.Add("777"); // 写法1:转List即时执行映射,后续直接操作结果集合 List<string> result = nums.Select(num => GetStrings(num)).ToList(); foreach(var item in result) { Console.WriteLine(item); } // 写法2:不提前转集合,foreach遍历的时候才执行映射 // IEnumerable<string> result = nums.Select(num => GetStrings(num)); // foreach(var item in result) // { // Console.WriteLine(item); // } } private static string GetStrings (string num){ if (num == "999") return "US"; else if (num == "888") { return "GB"; } else { return "PL"; } } } }
运行后会按顺序输出US、GB、PL,调试时也能看到GetStrings被正常调用。
内容的提问来源于stack exchange,提问作者GloriousCheescake
相关产品推荐
相关产品推荐

