C# WPF项目升级.NET 4.7.2后IOrderedEnumerable无WithPrevious定义报错问询
问题解决方法
WithPrevious 并非.NET基础类库或主流NuGet包的公开API,属于你项目历史依赖的自定义扩展方法、内部工具类库API,或是已停止维护的小众类库提供的方法,功能为遍历序列时将当前元素与前一个元素配对返回,返回对象包含HasPrevious(是否存在前序元素)、Previous(前序元素)、Current(当前元素)三个属性。
解决方案
直接在项目中手动实现该扩展方法即可,同时你代码中后续用到的.With()方法也属于同一系列的自定义扩展(功能为向序列末尾追加单个元素),可以一并实现:
1. 定义返回结果的通用类
public class ElementWithPrevious<T> { public bool HasPrevious { get; set; } public T Previous { get; set; } public T Current { get; set; } }
2. 实现扩展方法
public static class EnumerableExtensions { public static IEnumerable<ElementWithPrevious<T>> WithPrevious<T>(this IEnumerable<T> source) { if (source == null) throw new ArgumentNullException(nameof(source)); T previous = default; bool hasPrevious = false; foreach (var current in source) { yield return new ElementWithPrevious<T> { HasPrevious = hasPrevious, Previous = previous, Current = current }; previous = current; hasPrevious = true; } } // 同步实现代码中用到的With扩展方法,用于追加元素 public static IEnumerable<T> With<T>(this IEnumerable<T> source, T element) { foreach (var item in source) { yield return item; } yield return element; } }
使用说明
- 把以上两个代码片段放到项目的公共工具类目录下,确保
EnumerableExtensions所在的命名空间在你报错的代码文件中已经using引入,即可解决编译报错 - 该实现完全匹配你现有代码的业务逻辑:排序后的周期序列经过
WithPrevious处理后,过滤掉第一个没有前序元素的项,即可得到每两个连续周期的配对,之后通过With方法追加最后一个周期到最大周期的配对,和你原有代码的执行结果完全一致
内容的提问来源于stack exchange,提问作者MartinS
相关产品推荐
相关产品推荐

