如何每 n 个项目迭代一个循环



我有一个项目列表,我需要遍历它,以便首先收集每个n个(例如3个)项目,然后在第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();
 }

有没有更好的方法来做上述事情?

您也可以使用 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)
}

你可以用 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...
}

我建议使用嵌套循环。没有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
}

但是与您现在拥有的非常相似。我认为它不会比你拥有的黄油多。

您可以使用以下代码:

var MyObjectList = new List<MyObject>();
MyObjectList.Where(a => MyObjectList.IndexOf(a) % 3 == 0).ToList().ForEach(a => 
{
        // do your things!
});

相关内容

最新更新