Как разделить список парных чисел на n блоков, в которых первый элемент следующей серии будет последним из предыдущей серии - PullRequest
1 голос
/ 27 января 2020

У меня есть список вроде:

1.-10
2.-11
3.-12
4.-13
5.-14
6.-15
7.-16
8.-17
9.-18
10.-19
11.-20

Я хочу разделить список на n куски, например n=4 приведет к 3 lists:

первый список

1.-10
2.-11
3.-12
4.-13

второй список

1.-13
2.-14
3.-15
4.-16

третий список

1.-16
2.-17
3.-18
4.-19

Поскольку это неполный список, он отбрасывается

1.-19
2.-20

I я делаю

public static void Main()
{
    var list = new List<double>()
    {
        10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
    };
    var subLists = SplitList(list, 3);
}
public static List<List<T>> SplitList<T>(IList<T> source, int chunkSize)
{
    var chunks = new List<List<T>>();
    List<T> chunk = null;
    var total = source.Count;
    var discarded = total % chunkSize;
    for (var i = 0; i < total - discarded; i++)
    {
        if (i % chunkSize == 0)
        {
            chunk = new List<T>(chunkSize);
            chunks.Add(chunk);
        }
        chunk?.Add(source[i]);
    }
    return chunks;
}

но получаю:

1.-10
2.-11
3.-12
4.-13

1.-14
2.-15
3.-16
4.-17

Ответы [ 2 ]

2 голосов
/ 27 января 2020

Используйте функции skip и linq:

public static void Main()
{
   var list = new List<double>() { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
   List<List<double>> chunks = SplitList(list, 4);
}

public static List<List<T>> SplitList<T>(IList<T> source, int chunkSize)
{
    List<List<T>> chunks = new List<List<T>>();

    for (int i = 0; i < source.Count; i += (chunkSize - 1))
    {
        var subList = source.Skip(i).Take(chunkSize).ToList();
        if (subList.Count == chunkSize)
        {
            chunks.Add(subList);
        }                
    }
    return chunks;
}
1 голос
/ 27 января 2020

На основе этого ответа вы можете использовать для этой задачи LINQ: для разделения списка на подсписки с LINQ :

using System.Collections.Generic;
using System.Linq;

namespace SplitExample
{
    public class Program
    {
        public static void Main()
        {
            var list = new List<double>()
            {
                10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
            };
            var subLists = Split<double>(list, 3);
        }
        public static List<List<T>> Split<T>(List<T> source, int chunkSize)
        {
            return source
                .Select((x, i) => new { Index = i, Value = x })
                .GroupBy(x => x.Index / chunkSize)
                .Select(x => x.Select(v => v.Value).ToList())
                .ToList();
        }
    }

}
...