You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:48:01