如何正确使用C# LINQ的Zip<TFirst,TSecond>方法简化双列表遍历?
C# 遍历两个等长列表简化Zip写法的解决方案
适配.NET 6及以上版本
.NET 6 已经新增了无结果选择器参数的Zip重载,默认返回包含两个对应元素的值元组,直接省略冗余lambda即可:
var numbers = new List<int> { 1, 2, 3 }; var words = new List<string> { "one", "two", "three" }; foreach (var (number, word) in numbers.Zip(words)) { // 执行对应操作 }
如果你想用你最初写的静态调用格式Zip(numbers, words),需要额外引入静态引用:
using static System.Linq.Enumerable;
适配.NET 5及更低版本
低版本框架没有对应重载的情况下,可以自行封装通用扩展方法,后续无需重复写lambda:
- 先定义扩展方法类
public static class EnumerableExtensions { public static IEnumerable<(TFirst First, TSecond Second)> Zip<TFirst, TSecond>( this IEnumerable<TFirst> first, IEnumerable<TSecond> second) { return first.Zip(second, (item1, item2) => (item1, item2)); } }
- 后续使用时和.NET 6+写法完全一致
foreach (var (number, word) in numbers.Zip(words)) { // 执行对应操作 }
注意事项
Zip方法默认会取两个序列中更短的长度作为遍历上限,如果你确认两个列表长度完全一致,不会有数据截断问题。
内容的提问来源于stack exchange,提问作者MK Span
相关产品推荐
相关产品推荐

