代码之家  ›  专栏  ›  技术社区  ›  mpen

Linq可枚举<T>.ElementAt=>IEnumerable<T>

  •  1
  • mpen  · 技术社区  · 14 年前

    ElementAt 除非它返回一个 IEnumerable<T> SelectRange(startIndex, endIndex)

    4 回复  |  直到 14 年前
        1
  •  12
  •   Jon Skeet    14 年前

    最简单的方法就是

    source.Skip(count).Take(1)
    

    source.Skip(startIndex).Take(endIndex - startIndex)
    

    (假设包含 startIndex 但是独家的 endIndex

        2
  •  3
  •   mpen    14 年前

    啊。。它叫 GetRange(index, count) . 我的错。刚刚找到:)

        3
  •  3
  •   Ani    14 年前

    可能的 Enumerable.Skip :它当前似乎没有利用上的索引器 IList IList<T> Enumerable.ElementAt 做。

    所以另一个解决方案是:

    var itemAsSequence = new[] { source.ElementAt(index) };
    

    请注意,这将急切地执行。如果希望延迟执行语义类似于Jon的答案,可以执行以下操作:

    public static IEnumerable<T> ElementAtAsSequence<T>
      (this IEnumerable<T> source, int index)
    {
       // if you need argument validation, you need another level of indirection
    
       yield return source.ElementAt(index);
    }
    
    ...
    
    var itemAsSequence = source.ElementAtAsSequence(index);
    

    我应该指出,由于这依赖于一个实现细节,未来LINQ对对象的改进可能会使这种优化变得多余。

        4
  •  1
  •   Saeed Amiri    14 年前

        public static IEnumerable<T> ToMyEnumerable<T>(this T input)
        {
            var enumerbale = new[] { input };
            return enumerbale;
        }
    
        source.First( p => p.ID == value).ToMyEnumerable<T>()
    

    这是O(n)