Мне очень нравится algorithm, показанный ниже, для разделения списка на подсписок фиксированного размера. Это может быть не наиболее эффективный алгоритм (изменить: вообще).Эффективный список разделов на куски фиксированного размера
Я хотел бы что-то, что имеет хороший баланс читаемости, элегантности и производительности. Проблема заключается в том, что большинство алгоритмов я нахожу в C# требуется yield
ключевое слово, которое не доступно, если вы используете .NET 3.5 в Visual Studio 2010;)
public IEnumerable<IEnumerable<T>> Partition<T>(IEnumerable<T> source, int size)
{
if (source == null)
throw new ArgumentNullException("list");
if (size < 1)
throw new ArgumentOutOfRangeException("size");
int index = 1;
IEnumerable<T> partition = source.Take(size).AsEnumerable();
while (partition.Any())
{
yield return partition;
partition = source.Skip(index++ * size).Take(size).AsEnumerable();
}
}
Я пытался переписывать это в VB, но должен был используйте второй список для сбора результатов, в результате чего значительно больше времени, чем реализация выше.
Я ищу другой алгоритм, который я мог бы использовать в VB.NET, но большая часть результатов столкнулась с проблемой необходимости загружать все в память вместо возможности динамически производить результаты. a la генераторы в python. Не огромная проблема, но не такая идеальная, как это было бы с yield return
.
Есть ли хороший, рекомендуемый алгоритм для этого в VB.NET? Должен ли я создать что-то, реализующее IEnumerator
, чтобы генерировать результаты по запросу?
Я считаю, что доходность была введена в .NET 2.0 –
возможный дубликат [Yield in VB.NET] (http://stackoverflow.com/questions/97381/yield-in-vb-net) –
@MitchWheat I don ' t думаю, что ... Это не в этом [список ключевых слов VB] (http://msdn.microsoft.com/en-us/library/dd409611 (v = vs.100) .aspx) в VS2010 как минимум .. –