Разделить список <User>на несколько списков <User>в c # - PullRequest
1 голос
/ 13 октября 2011

Я хочу разделить Список пользовательских универсальных списков на небольшой список с каждыми 5 записями.

Ex

I have List: u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15.
so must be split into 
List1:u1,u2,u3,u4,u5
List2:u6,u7,u8,u9,u10
List3:u11,u12,u13,u14,u15

Любой прямой метод доступен или нужна логика программирования на c #?

Ответы [ 4 ]

5 голосов
/ 13 октября 2011

Вы можете группировать по индексу:

List<List<User>> lists =
  list
  .Select((u, i) => new { List = i / 5, User = u })
  .GroupBy(g => g.List, g => g.User)
  .Select(g => g.ToList())
  .ToList();

Вы также можете использовать Range, чтобы сделать цикл и получить часть списка для каждой итерации:

List<List<User>> lists =
  Enumerable.Range(0, (list.Count + 4) / 5)
  .Select(n => list.Skip(n * 5).Take(5).ToList())
  .ToList();
0 голосов
/ 13 октября 2011

Я думаю, что это может быть более эффективным, поскольку вы не делаете группировок, заказов и тому подобное.Это всего лишь одна итерация по набору данных.

var splitList= new List<IEnumerable<User>>();
List<User> currentList = null;
int count = 0;
foreach(var user in users)
{
    if (0 == count% 5)
    {
        currentList = new List<User>(5);
        returnValue.Add(currentList);
    }
    currentList.Add(key);
    count++;
}
return returnValue;
0 голосов
/ 13 октября 2011
// These are your objects, put here your init code
var list = Enumerable.Range(1, 20).ToList(); 


var lists = new List<int>[(list.Count + 4) / 5]; // The array of lists you wanted

for (int i = 0; i < lists.Length; i++)
{
    lists[i] = list.Skip(i * 5).Take(5).ToList();
}

(list.Count + 4) / 5 - метод округления до деления (если у меня есть 6 элементов в списке, я хочу два подсписка)

Если вам действительно нужно List из List ...

var lists = new List<List<int>>((list.Count + 4) / 5);

for (int i = 0; i < lists.Capacity; i++)
{

    lists.Add(list.Skip(i * 5).Take(5).ToList());
}
0 голосов
/ 13 октября 2011

Вы можете использовать методы Пропустить (считать) и Взять (считать).

...