适用于 .Net Framework 4.6 和更新版本的 C# TakeLast 扩展

C# TakeLast Extension for .Net Framework 4.6 and newer versions

我正在寻求帮助,寻找有人编写的 TakeLast 扩展方法,该方法适用于旧版本的 .Net Framework,如 4.6 及更高版本。默认的 TakeLast 方法仅适用于我的 .Net 5 和 .Net 6 项目,但我试图让我的程序在 .Net Framework 上成为 运行,这是我唯一无法弄清楚的事情是如何解决缺少 TakeLast

您可以实现自己的扩展方法,如下所示:

public static partial class EnumearbleExtensions {
  public static IEnumerable<T> TakeLast<T>(this IEnumerable<T> source, int count) {
    if (null == source)
      throw new ArgumentNullException(nameof(source));
    if (count < 0)
      throw new ArgumentOutOfRangeException(nameof(count));

    if (0 == count)
      yield break;

    // Optimization (see JonasH's comment)
    if (source is ICollection<T>) {
      foreach (T item in source.Skip(((ICollection<T>)source).Count - count))
        yield return item;

      yield break;
    }

    if (source is IReadOnlyCollection<T>) {
      foreach (T item in source.Skip(((IReadOnlyCollection<T>)source).Count - count))
        yield return item;

      yield break;
    }

    // General case, we have to enumerate source
    Queue<T> result = new Queue<T>();

    foreach (T item in source) {
      if (result.Count == count)
        result.Dequeue();

      result.Enqueue(item);
    }

    foreach (T item in result)
      yield return result.Dequeue();
  }
}