Есть ли эквивалент окна F # Seq. В C #?
Вопрос
Я работаю над некоторым кодом C #, который решает такие проблемы, как скользящие средние, когда мне часто приходится брать List / IEnumerable и работать с фрагментами последовательных данных.В модуле F # Seq есть отличная оконная функция, которая, принимая Sequence, возвращает последовательность фрагментов последовательных элементов.
Есть ли в C # готовая к работе эквивалентная функция с LINQ?
Решение
Вы всегда можете просто вызвать SeqModule.Windowed
из C #, вам просто нужно сослаться на FSharp.Core.Dll
.Имена функций также немного искажены, поэтому вы вызываете Windowed
, а не windowed
, чтобы он соответствовал соглашениям C # о заглавных буквах
Другие советы
Вы всегда можете накатить свой собственный (или перевести тот, который был взят из ядра F #):
родовое словоМоя попытка выглядит так, это намного медленнее, чем простой вызов F # (как было предложено Джоном Палмером).Я предполагаю, что это из-за того, что F # использует массив Unchecked .:
родовое словоВ Reactive Extensions есть несколько операторов, которые помогут с этим, например Buffer и Окно .Интерактивные расширения, которые можно найти в экспериментальной ветви, добавляют эти и значительное количество дополнительных операторов в LINQ.
John Palmer's answer is great, here is an example based on his answer.
var numbers = new[] {1, 2, 3, 4, 5};
var windowed = SeqModule.Windowed(2, numbers);
You may (or not) want to add ToArray() to the end, without ToArray, the return type is still in F# world (Sequence). With ToArray, it is back to C# world (Array).