我有一个项目列表,我需要遍历它,以便首先收集每个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!
});