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; } } }
解决方法
以下是在LINQ中完成的方法:
int[] source = new[] { 3,6,1,8,4,7,2,2 }; var result = source.Where((x,i) => i == 0 || !x.Equals(source.ElementAt(i - 1)));
但是,只有在基础序列实现处理ElementAt调用的有效索引器时,才应使用此代码,理想情况是在O(1)时间内.这通常是IList< T>的情况.实现,例如数组,但不适用于其他集合,例如LinkedList< T>.
此外,如果您需要定期使用此功能,那么定义扩展方法没有任何问题,这比在整个地方散布此代码(或任何等效代码)更具可维护性.我个人更喜欢使用您自己的扩展方法来避免非索引集合上的性能问题风险.