C#中如何以更地道方式实现带索引的List.All元素验证?
实现带索引的集合全验证(C#)
方法一:自定义扩展方法(最推荐)
给IEnumerable<T>实现一个带索引参数的All扩展方法,完全复用原生All的调用体验,是最地道的解决方案:
public static class EnumerableExtensions { public static bool All<T>(this IEnumerable<T> source, Func<T, int, bool> predicate) { if (source == null) throw new ArgumentNullException(nameof(source)); if (predicate == null) throw new ArgumentNullException(nameof(predicate)); int index = 0; foreach (var item in source) { if (!predicate(item, index)) return false; index++; } return true; } }
调用时和你最初设想的代码完全一致:
bool result = list.All((element, index) => element != null && index % 2 == 0);
这个方法复用性极强,整个项目都能像调用原生LINQ方法一样使用,完全符合C#的设计风格。
方法二:简化现有LINQ写法
如果不想新增扩展方法,可以把冗余的All(identity => identity)简化为更紧凑的形式,逻辑和你原代码一致,但可读性更好:
bool result = list.Select((element, index) => element != null && index % 2 == 0) .All(x => x);
方法三:手动循环(性能最优)
如果操作的是List<T>,直接使用for循环可以避免LINQ的委托调用开销,性能更优,尤其是处理大型集合时:
bool result = true; for (int i = 0; i < list.Count; i++) { var element = list[i]; if (!(element != null && i % 2 == 0)) { result = false; break; } }
内容的提问来源于stack exchange,提问作者beyarkay
相关产品推荐
相关产品推荐

