Nicht direkt. Sie könnten relativ einfach eine SingleShotEnumerable<T>
Allerdings:
public sealed class SingleShotEnumerable<T> : IEnumerable<T>
{
private IEnumerator<T> enumerator;
public SingleShotEnumerable(IEnumerator<T> enumerator)
{
if (enumerator == null)
{
throw new ArgumentNullException("enumerator");
}
this.enumerator = enumerator;
}
public IEnumerator<T> GetEnumerator()
{
if (enumerator == null)
{
throw new InvalidOperationException
("GetEnumerator can only be called once");
}
var ret = enumerator;
enumerator = null;
return ret;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Dies setzt voraus, dass Sie eigentlich haben eine IEnumerator<T>
. Wenn Sie nur eine IEnumerator
könnten Sie etwas Ähnliches schreiben, nur dass Sie IEnumerable
verwenden, dann Cast
o OfType
um zu einem IEnumerable<T>
.
(Hinweis: Dies ist nicht thread-sicher. Sie könnten es mit Sperren so machen, wenn Sie wirklich wollten).
Das könnten Sie dann tun:
var filtered = from person in new SingleShotEnumerable<Person>(personEnumerator)
where person.Age > 18
select person.Name;
... aber Sie können die Abfrage nicht zweimal verwenden.
Wie sind Sie in die merkwürdige Situation gekommen, dass Sie nur eine IEnumerator<T>
überhaupt? Das ist ziemlich selten. Versuchen Sie, das zu umgehen, um zu vermeiden, dass Sie etwas wie das oben beschriebene tun müssen, das ziemlich anfällig ist.
(Eine Alternative wäre die "Entleerung" der IEnumerator<T>
zu einer List<T>
oder etwas Ähnliches, aber das hat Probleme mit großen oder potenziell unendlich Sequenzen).