C# IEnumerable 等效于 java 迭代器的 next() 方法?
C# IEnumerable equivalent of next() method of java Iterator?
我发现 (here)一种在 c# 中模仿 Java 的迭代器方法的迭代器实现,但我不太确定如何在我的案例中使用它,或者如果有一个更简单的选项可以用 c# 的方式重写此方法。
原始 java 方法:
public RWIterator<T> search (T e){
RWIterator<T> it =null;
RWIterator<T> current = iterator();
RWIterator<T> prev = iterator();
boolean found=false;
while(! found && current.hasNext()){
T el=current.next();
if (el.equals(e)) found = true;
else prev.next();
}
if (found) {
//Iterator<T> tmp = prev;
//System.out.println("searched value is="+tmp.next());
it = prev;
}
return it;
}
Where RWIterator extends java Iterator,看不懂prev的用法,卡在这了:
public RWIterator<T> Search(T e)
{
RWIterator<T> it = null;
RWIterator<T> current = Iterator();
RWIterator<T> prev = Iterator();
bool found = false;
while (!found && current.GetEnumerator().MoveNext())
{
T el = current.GetEnumerator().Current;
if (el.Equals(e)) found = true;
else
{
//what should happen with prev.GetEnumerator().Current ?
}
}
if (found)
{
//Iterator<T> tmp = prev;
//System.out.println("searched value is="+tmp.next());
it = prev;
}
return it;
}
C# 有 foreach
循环来访问 IEnumerable
s。可以使用 foreach
.
访问具有 GetEnumerator
方法的每个对象
我认为您不应该尝试将 Java 直接翻译成 C#,因为底层概念存在一些差异。在 Java 中有 Iterator
s,在 C# 中有 IEnumerable
实现。然后使用 foreach
完成迭代。
public RWIterator<T> Search(T e)
{
RWIterator<T> it = null;
RWIterator<T> current = Iterator();
RWIterator<T> prev = Iterator();
bool found = false;
// while (!found && current.GetEnumerator().MoveNext())
foreach(T el in current)
{
// T el = current.GetEnumerator().Current;
if (el.Equals(e)) found = true;
else
{
//what should happen with prev.GetEnumerator().Current ?
}
}
if (found)
{
//Iterator<T> tmp = prev;
//System.out.println("searched value is="+tmp.next());
it = prev;
}
return it;
}
可以使用GetEnumerator
方法获取Enumerator
的引用,然后可以使用MoveNext
方法继续,使用Current
属性 访问您的元素:
var enumerator = getInt().GetEnumerator();
while(enumerator.MoveNext())
{
int n = enumerator.Current;
Console.WriteLine(n);
}
好的,伙计,你的搜索方法试图实现的目标是 运行 遍历迭代器,直到找到匹配项。然后它将 return 一个从此匹配开始的迭代器。这是您的方法的替代方法,可实现我刚才描述的内容:
public RWIterator<T> Search(T e)
{
RWIterator<T> myIterator = Iterator();
bool found = false;
foreach (T element in myIterator)
{
if (found)
yield return element;
else if (element.Equals(e))
{
found = true;
yield return element;
}
}
}
我发现 (here)一种在 c# 中模仿 Java 的迭代器方法的迭代器实现,但我不太确定如何在我的案例中使用它,或者如果有一个更简单的选项可以用 c# 的方式重写此方法。 原始 java 方法:
public RWIterator<T> search (T e){
RWIterator<T> it =null;
RWIterator<T> current = iterator();
RWIterator<T> prev = iterator();
boolean found=false;
while(! found && current.hasNext()){
T el=current.next();
if (el.equals(e)) found = true;
else prev.next();
}
if (found) {
//Iterator<T> tmp = prev;
//System.out.println("searched value is="+tmp.next());
it = prev;
}
return it;
}
Where RWIterator extends java Iterator,看不懂prev的用法,卡在这了:
public RWIterator<T> Search(T e)
{
RWIterator<T> it = null;
RWIterator<T> current = Iterator();
RWIterator<T> prev = Iterator();
bool found = false;
while (!found && current.GetEnumerator().MoveNext())
{
T el = current.GetEnumerator().Current;
if (el.Equals(e)) found = true;
else
{
//what should happen with prev.GetEnumerator().Current ?
}
}
if (found)
{
//Iterator<T> tmp = prev;
//System.out.println("searched value is="+tmp.next());
it = prev;
}
return it;
}
C# 有 foreach
循环来访问 IEnumerable
s。可以使用 foreach
.
GetEnumerator
方法的每个对象
我认为您不应该尝试将 Java 直接翻译成 C#,因为底层概念存在一些差异。在 Java 中有 Iterator
s,在 C# 中有 IEnumerable
实现。然后使用 foreach
完成迭代。
public RWIterator<T> Search(T e)
{
RWIterator<T> it = null;
RWIterator<T> current = Iterator();
RWIterator<T> prev = Iterator();
bool found = false;
// while (!found && current.GetEnumerator().MoveNext())
foreach(T el in current)
{
// T el = current.GetEnumerator().Current;
if (el.Equals(e)) found = true;
else
{
//what should happen with prev.GetEnumerator().Current ?
}
}
if (found)
{
//Iterator<T> tmp = prev;
//System.out.println("searched value is="+tmp.next());
it = prev;
}
return it;
}
可以使用GetEnumerator
方法获取Enumerator
的引用,然后可以使用MoveNext
方法继续,使用Current
属性 访问您的元素:
var enumerator = getInt().GetEnumerator();
while(enumerator.MoveNext())
{
int n = enumerator.Current;
Console.WriteLine(n);
}
好的,伙计,你的搜索方法试图实现的目标是 运行 遍历迭代器,直到找到匹配项。然后它将 return 一个从此匹配开始的迭代器。这是您的方法的替代方法,可实现我刚才描述的内容:
public RWIterator<T> Search(T e)
{
RWIterator<T> myIterator = Iterator();
bool found = false;
foreach (T element in myIterator)
{
if (found)
yield return element;
else if (element.Equals(e))
{
found = true;
yield return element;
}
}
}