[LINQ].NET/C#应用程序开发中如何使用LINQ查询集合List<T>中N的倍数索引位置的所有元素?

C#开发 作者: Rector 139阅读 0评论 0收藏 收藏本文

郑重申明:本文未经许可,禁止任何形式转载

问题描述

在.NET/C#应用程序开发中,当前有一个泛型集合List<T>,如何使用LINQ查询这个集合List<T>中索引位置在N的倍数的所有元素?

方案一

var result = list.Where((x, i) => i % nStep == 0);

方案二

使用yield return,而不使用LINQ或者Lambda表达式,如下:

IEnumerator<T> GetNth<T>(List<T> list, int n) {
  for (int i=0; i<list.Count; i+=n)
    yield return list[i]
}

当然,我们也可以把它改写成静态扩展方法,如下:

public static class MyListExtensions {
  public static IEnumerable<T> GetNth<T>(this List<T> list, int n) {
    for (int i=0; i<list.Count; i+=n)
      yield return list[i];
  }
}

如果在LINQ语句中使用:

from var element in MyList.GetNth(10) select element;

或者使用LINQ的方式实现,如下:

from var i in Range(0, ((myList.Length-1)/n)+1) select list[n*i];

方案三

写一个静态扩展方法,如下:

public static class LinqExtensions
{
    public static IEnumerable<T> GetNth<T>(this IEnumerable<T> list, int n)
    {
        if (n < 0)
            throw new ArgumentOutOfRangeException("n");
        if (n > 0)
        {
            int c = 0;
            foreach (var e in list)
            {
                if (c % n == 0)
                    yield return e;
                c++;
            }
        }
    }
    public static IEnumerable<T> GetNth<T>(this IList<T> list, int n)
    {
        if (n < 0)
            throw new ArgumentOutOfRangeException("n");
        if (n > 0)
            for (int c = 0; c < list.Count; c += n)
                yield return list[c];
    }
}

阅读了该文章的人还浏览了...

本文永久链接码友网 » [LINQ].NET/C#应用程序开发中如何使用LINQ查询集合List<T>中N的倍数索引位置的所有元素?

发布于: 2018-04-20 08:58:52
分享扩散:

文章评论

获取验证码