2016-05-21 3 views
3

У меня есть список элементов, и мне нужно пройти через него, чтобы каждый элемент n (например, 3) был сначала собран, а затем обработан сразу на n-ом элементе.Как перебирать петлю каждый n элементов

Я делаю следующее:

List<MyObject> smallList = new List<MyObject>(); 

for (int i = 0; i < largeList.Count; i++) 
{ 
    smallList.Add(largeList[i]); 

    if (i % 3 == 0 || i >= largeList.Count - 3) 
    { 
     //Do somehting with those n items... 
    } 

    smallList.Clear(); 
} 

Есть ли лучший способ сделать выше?

ответ

6

Вы также можете сделать это с помощью LINQ:

var largeList = new List<int>(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); 
for (int i = 0; i < largeList.Count; i += 3) 
{ 
    var items = largeList.Skip(i).Take(3).ToList(); 
    // do stuff with your 3 (or less items) 
} 
+1

Это может сделать много полных нумерации всей largeList. – Evk

+2

Вы должны начать с 'i = 0', иначе вы пропустите первые три. – Toxantron

+0

@ Toxantron действительно, исправлено. – kagelos

0

Я предлагаю использовать вложенные циклы. Не так красиво, как LinQ, но, конечно, быстрее.

const int n = 3; 
var small = new List(); 
for(var i=0; i<large.Count; i+=n) 
{ 
    small.Clear(); 
    for(var j=i; j < n && j<large.Count; j++) 
     small.Add(large[j]); 
    // Do stuff with small 
} 

Однако очень похоже на то, что у вас есть сейчас. Я думаю, что масла не так много, как у вас.

1

Вы можете сделать это с помощью LINQ.

Во-первых, "прикрепить" индекс к каждому пункту:

var indexedItems = largeList.Select((item, index) => new {index, item}); 

Теперь сгруппировать их по их индексу, при выборе коллекции (IEnumerable) элементов для каждого члена группы:

var groupedItems = indexedItems.GroupBy(indexedItem => indexedItem.index/3, 
        indexedItem => indexedItem.item, 
        (key, items) => items); 

Теперь обрабатывайте каждую группу

foreach(var items in groupedItems) { 
    // and optionally, .ToList() to have a List<T> instead of IEnumerable<T> 
    var itemsList = items.ToList(); 
} 

И всего ...:

var indexedItems = largeList.Select((item, index) => new {index, item}); 
var groupedItems = indexedItems.GroupBy(indexedItem => indexedItem.index/3, 
        indexedItem => indexedItem.item, 
        (key, items) => items); 

foreach(var items in groupedItems) { 
    // Use the items... 
} 
+0

Выглядит не намного лучше, чем для цикла :) – Evk

+0

@Evk - Я согласен ... Я изменил его, чтобы быть более эффективным, но я до сих пор не вижу причины, чтобы не использовать простой цикл. – Amit

0

вы можете использовать этот код:

var MyObjectList = new List<MyObject>(); 

MyObjectList.Where(a => MyObjectList.IndexOf(a) % 3 == 0).ToList().ForEach(a => 
{ 
     // do your things! 
}); 
Смежные вопросы