Реализовать IEnumerable в Fsharp по внешнему типу - PullRequest
0 голосов
/ 24 февраля 2012

Я пытаюсь реализовать свойство ToEnumerable для внешнего типа, который его не реализует.Я не могу заставить код работать.

Поэтому я потряс его до добавления нетипизированного свойства GetEnumerator и добавил для руководства код для ToComparable.Однако я понятия не имею, как хранить изменяемое состояние для счетчика.

Является ли pb анонимным классом?

Как бы вы это сделали?

open System
open System.Collections
open System.Collections.Generic

type Bloomberglp.Blpapi.Element with
     //**WORKS OK**
     member this.ToComparable:IComparer<Bloomberglp.Blpapi.Element> =   { 
        new IComparer<Bloomberglp.Blpapi.Element> with 
           member this.Compare(x, y) = x.NumValues.CompareTo(y.NumValues) 
     }

     //**WORKS (sort of) OK without storing the state**
     member this.GetEnumerator2:IEnumerator =  {
        //let mutable i =0
        new IEnumerator with
              member this2.Reset() = 
                 i <- 0;
                 ()
              member this2.MoveNext() = 
                 if i < n then 
                    i <- i + 1
                    true
                 else
                    false
              member this2.Current 
                 with get() =
                    this.GetElement(0) :> obj
     }

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Предполагая, что NumValues - это число, вы можете сделать что-то вроде этого:

type Bloomberglp.Blpapi.Element with
  member this.GetEnumerator() = 
    (Seq.init this.NumValues this.GetElement).GetEnumerator()

Возвращает IEnumerator<'T>, где 'T - тип возврата GetElement.

1 голос
/ 24 февраля 2012

Возвращаясь к вашей первоначальной идее добавления свойства ToEnumerable к типу, я мог бы назвать свойство AsEnumerable или AsSeq, поскольку Seq является термином F # для IEnumerable, и реализовать его примерно так:

type Bloomberglp.Blpapi.Element with
    member this.AsEnumerable =
        seq { for i = 0 to this.NumValues - 1 do
                  yield this.GetElement(i) }

Или вы можете сделать это с Seq.init, как предлагает Даниил:

type Bloomberglp.Blpapi.Element with
    member this.AsEnumerable =
        Seq.init this.NumValues this.GetElement
...