If we don't want to add IEnumerable (though it seems that IEnumerable could
be added in parallel with the existing pattern) could we add a bunch of
extension methods?
Something like the following...
{noformat}
public static class LuceneExtensions
{
public static IEnumerable<Term> GetEnumerable(this TermEnum termEnum)
{
yield return termEnum.Term();
while (termEnum.Next())
yield return termEnum.Term();
}
}
{noformat}
Then you can...
{noformat}
foreach(var e in myTernEnum.GetEnumerable())
{
// do stuff with e
}
{noformat}
Not as elegant as a direct implementation but gives easy enough access to
foreach sematics.
The second option is to realize that you don't need to explicitly implement
IEnumerable. You just need a GetEnumerator method.
So just add...
{noformat}
public IEnumerable<Term> GetEnumerator()
{
yield return Term();
while (Next())
yield return Term();
}
{noformat}
Now you get nice foreach sematics without even mentioning IEnumerable.
Compiler magic is your friend :-)
BTW: Dispose() is only called automatically when exiting a using block.
Exiting a foreach will not.
Cheers,
Andy
On 24 January 2012 06:37, Christopher Currens (Created) (JIRA) <
[email protected]> wrote:
> Convert Java Iterator classes to implement IEnumerable<T>
> ---------------------------------------------------------
>
> Key: LUCENENET-469
> URL: https://issues.apache.org/jira/browse/LUCENENET-469
> Project: Lucene.Net
> Issue Type: Sub-task
> Components: Lucene.Net Contrib, Lucene.Net Core
> Affects Versions: Lucene.Net 2.9.4, Lucene.Net 3.0.3, Lucene.Net 2.9.4g
> Environment: all
> Reporter: Christopher Currens
> Fix For: Lucene.Net 3.0.3
>
>
> The Iterator pattern in Java is equivalent to IEnumerable in .NET.
> Classes that were directly ported in Java using the Iterator pattern,
> cannot be used with Linq or foreach blocks in .NET.
>
> {{Next()}} would be equivalent to .NET's {{MoveNext()}}, and in the below
> case, {{Term()}} would be as .NET's {{Current}} property. In cases as
> below, it will require {{TermEnum}} to become an abstract class with
> {{Term}} and {{DocFreq}} properties, which would be returned from another
> class or method that implemented {{IEnumerable<TermEnum>}}.
>
> {noformat}
> public abstract class TermEnum : IDisposable
> {
> public abstract bool Next();
> public abstract Term Term();
> public abstract int DocFreq();
> public abstract void Close();
> public abstract void Dispose();
> }
> {noformat}
>
> would instead look something like:
>
> {noformat}
> public class TermFreq
> {
> public abstract Term { get; }
> public abstract int { get; }
> }
>
> public abstract class TermEnum : IEnumerable<TermFreq>, IDisposable
> {
> // ...
> }
> {noformat}
>
> Keep in mind that it is important that if the class being converted
> implements {{IDisposable}}, the class that is enumerating the terms (in
> this case {{TermEnum}}) should inherit from both {{IEnumerable<T>}} *and*
> {{IDisposable}}. This won't be any change to the user, as the compiler
> automatically calls {{IDisposable}} when used in a {{foreach}} loop.
>
> --
> This message is automatically generated by JIRA.
> If you think it was sent incorrectly, please contact your JIRA
> administrators:
> https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
> For more information on JIRA, see: http://www.atlassian.com/software/jira
>
>
>