Вопрос

Я работаю над некоторым кодом 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).

enter image description here

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top