Linq非常强大,但有时我会发现自己急于进行扩展,后来我想知道我是否可以使用本机方法.
那么,是否可以在不使用扩展名的情况下实现以下内容?
/// <summary>
/// Removes duplicates that are immediately clustered together.
/// </summary>
public static IEnumerable<TData> DistinctLocal<TData>(this IEnumerable<TData> enumerable)
{
bool yielded = false;
TData last = default(TData);
foreach (var item in enumerable)
{
if (yielded == false || last.Equals(item) == false)
{
last = item;
yielded = true;
yield return item;
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下是如何在普通 LINQ 中完成此操作:
int[] source = new[] { 3, 6, 1, 8, 4, 1, 1, 1, 7, 4, 2, 2 };
var result = source.Where((x, i) => i == 0 || !x.Equals(source.ElementAt(i - 1)));
Run Code Online (Sandbox Code Playgroud)
然而,只有当底层序列实现了一个高效的索引器来处理调用时,才应该使用此代码ElementAt,最好是在 O(1) 时间内。这通常是实现的情况IList<T>,例如数组,但不适用于其他集合,例如LinkedList<T>.
此外,如果您需要定期使用此功能,那么定义扩展方法并没有什么问题,这比将此代码(或任何等效代码)分散在各处更易于维护。我个人更喜欢使用您自己的扩展方法来避免非索引集合上的性能问题的风险。