How to select values within a provided index range from a List using LINQ

后端 未结 4 770
北恋
北恋 2020-12-29 02:10

I am a LINQ newbie trying to use it to acheive the following:

I have a list of ints:-

List intList = new List(new int[]{1,2,3,3         


        
相关标签:
4条回答
  • 2020-12-29 02:41

    Use Skip then Take.

    yourEnumerable.Skip(4).Take(3).Select( x=>x )
    
    (from p in intList.Skip(x).Take(n) select p).sum()
    
    0 讨论(0)
  • 2020-12-29 02:46

    For larger lists, a separate extension method could be more appropriate for performance. I know this isn't necessary for the initial case, but the Linq (to objects) implementation relies on iterating the list, so for large lists this could be (pointlessly) expensive. A simple extension method to achieve this could be:

    public static IEnumerable<TSource> IndexRange<TSource>(
        this IList<TSource> source,
        int fromIndex, 
        int toIndex)
    {
        int currIndex = fromIndex;
        while (currIndex <= toIndex)
        {
            yield return source[currIndex];
            currIndex++;
        }
    }
    
    0 讨论(0)
  • 2020-12-29 02:49

    You can use GetRange()

    list.GetRange(index, count);
    
    0 讨论(0)
  • 2020-12-29 02:50

    To filter by specific indexes (not from-to):

    public static class ListExtensions
    {
       public static IEnumerable<TSource> ByIndexes<TSource>(this IList<TSource> source, params int[] indexes)
       {        
            if (indexes == null || indexes.Length == 0)
            {
                foreach (var item in source)
                {
                    yield return item;
                }
            }
            else
            {
                foreach (var i in indexes)
                {
                    if (i >= 0 && i < source.Count)
                        yield return source[i];
                }
            }
       }
    }
    

    For example:

    string[] list = {"a1", "b2", "c3", "d4", "e5", "f6", "g7", "h8", "i9"};
    var filtered = list.ByIndexes(5, 8, 100, 3, 2); // = {"f6", "i9", "d4", "c3"};
    
    0 讨论(0)
提交回复
热议问题