Как создать подсписки из списка с помощью linq? - PullRequest
0 голосов
/ 23 сентября 2019

Вот еще один способ Разделить список на более мелкие списки размером N

Цель этого поста - поделиться знаниями, касающимися "Linq" и мнений, без использования связей "for" и«диапазоны» напрямую.

Пример: у меня есть список из 100 элементов, и мне нужно сделать его из 10 списков.

Я использую следующий скрипт, у кого-то есть лучший способ или более эффективный?

var subLists = myList.Select((x, i) => new { Index = i, Item = x })
                     .GroupBy(x => x.Index / "MAXIMUM ITEMS ON SUBLIST")
                     .Select(x => x.Select(v => X.Item).ToList());

Ответы [ 3 ]

3 голосов
/ 23 сентября 2019

Это медленная операция

(x, i) => new { Index = i, Item = x }

Вот метод расширения, который будет работать с любым списком

public static IEnumerable<List<T>> splitList<T>(List<T> items, int size)  
{        
    for (int i=0; i < items.Count; i+= size) 
    { 
        yield return items.GetRange(i, Math.Min(size, items.Count - i)); 
    }  
}

ИЛИ лучшая производительность

public static List<List<T>> splitList<T>(this List<T> items, int size)
{
    List<List<T>> list = new List<List<T>>();
    for (int i = 0; i < items.Count; i += size)
        list.Add(items.GetRange(i, Math.Min(size, items.Count - i)));
    return list;
}
0 голосов
/ 24 сентября 2019

Этот вопрос не является дубликатом.Как уже упоминалось, я подвергаю сомнению возможную форму с использованием linq, которая была бы более перфорированной.Например, я знаю о «связях с« диапазоном ».

Спасибо всем за сотрудничество, комментарии и возможные решения !!!

0 голосов
/ 24 сентября 2019

Давайте создадим общий ответ.Тот, который работает для любой последовательности любой длины, где вы хотите разбить последовательность на последовательность подпоследовательностей, где каждая подпоследовательность имеет указанную длину, за исключением, может быть, последней:

Например:

IEnumerable<int> items = {10, 11, 12, 13, 14, 15, 16, 17};

// split into subsequences of length 3:
IEnumerable<IEnumerable> splitSequence = items.Split(3);
// splitSequence is a sequence of 3 subsequences:
// {10, 11, 12},
// {13, 14, 15},
// {16, 17}

Мы сделаем это, создав метод расширения.Таким образом, метод Split может использоваться как любая функция LINQ.См. Расширение методов демистификации .Чтобы сделать это эффективным, я буду перечислять только один раз, и я не буду перечислять больше элементов, чем запрашивается.

IEnumerable<TSource> Split(this IEnumerable<TSource> source, int splitSize)
{
    // TODO: exception if null source, or non-positive splitSize

    // Get the enumerator and enumerate enough elements to return
    IEnumerator<TSource> enumerator = source.GetEnumerator();
    while (enumerator.MoveNext())
    {
        // there are still items in the source; fill a new sub-sequence
        var subSequence = new Tsource[SplitSize];
        int index = 0;
        do
        {
            subSequence[index] = enumerator.Current;
            ++index;
        }
        // repeat this until the subSequence is full or until source has no more elements
        while (index < splitSize && enumerator.MoveNext());

        // return the subSequence
        yield return subSequence;
     }
}

Использование:

// Get all Students that live in New York, split them into groups of 10 Students
// and return groups that have at least one Law Student 
var newYorkLasStudentGroups = GetStudents();
   .OrderBy(student => student.UniversityLocation == "New York")
   .Split(10)
   .Where(studentGroup => studentGroup.Any(student => student.Study == "Law"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...