适用于 .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();
}
}
我正在寻求帮助,寻找有人编写的 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();
}
}