标签: ienumerator

IEnumerator是否有"HasNext"方法?

使用Java Iterator,我使用该hasNext方法来确定迭代是否具有更多元素(不消耗元素) - 因此,hasNext就像一个" Peek"方法.

我的问题:C#的通用s 有什么类似于" hasNext"或" Peek"的方法IEnumerator吗?

c# ienumerator iterator peek

10
推荐指数
2
解决办法
2万
查看次数

为什么.NET没有双向枚举器?

关于如何实现双向枚举器(这里,这里)的问题已被问过几次.我的问题不是如何(对于大多数情况来说这是微不足道的),但为什么 .NET平台中不存在这样的类型.

public interface IBidirectionalEnumerator<T> : IEnumerator<T>
{
    bool MovePrev();
}
Run Code Online (Sandbox Code Playgroud)

显然,有许多集合类型无法实现这一点,因为它MoveNext()是破坏性的或改变底层集合的状态.但反过来,很多类型可以平凡实现这一点(List,IList,LinkedList,array).

为什么不存在这种类型?

.net c# ienumerator enumerators

10
推荐指数
1
解决办法
1841
查看次数

什么是foreach的for/while等价物?

我有一个foreach需要转换为forwhile循环的循环.我的循环看起来像这样:

foreach (Item item in Items)
{
    // some stuff
}
Run Code Online (Sandbox Code Playgroud)

什么是等价物forwhile循环?

我想我需要用来GetEnumerator获得IEnumerator<Item>,但我不知道如何正确使用它.Items不是列表,否则我会使用索引.

.net c# ienumerable ienumerator foreach

10
推荐指数
2
解决办法
3136
查看次数

在Coroutine中"yield return 0"和"yield return null"之间有什么区别?

我是新人,对" yield" 有点困惑.但最后我明白它是如何运作的WaitForSeconds

但我看不出" yield return 0"和" yield return null" 之间的区别.

他们都在等待下一帧执行吗?

对不起,我的英语不好.非常感谢你.

c# ienumerator yield coroutine unity-game-engine

10
推荐指数
1
解决办法
7855
查看次数

IEnumerable <T>提供了两个GetEnumerator方法 - 它们之间有什么区别?

当我实现IEnumerable<T>界面时,我看到两个GetEnumerator方法:一个返回IEnumerator和另一个IEnumerator<T>.我何时会使用其中一种?

ienumerable ienumerator

9
推荐指数
3
解决办法
5347
查看次数

何时调用IEnumerable.GetEnumerator而不是IEnumerable <T> .GetEnumerator?

看看这段代码:

public class myWords : IEnumerable<string>
{
    string[] f = "I love you".Split(new string[]{"lo"},StringSplitOptions.RemoveEmptyEntries);

    public IEnumerator<string> GetEnumerator()
    {
        return f.Select(s => s + "2").GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return f.Select(s => s + "3").GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)

跑步:

 myWords m = new myWords();
 foreach (var s in m)
 {
     Console.WriteLine(s);
 }
Run Code Online (Sandbox Code Playgroud)

产量

I 2
ve you2    // notice "2", so the generic Ienumerator has executed.
Run Code Online (Sandbox Code Playgroud)

我知道非通用IEnumerator版本是为了兼容性.

题:

  1. 在什么情况下会调用非泛型?
  2. 如何强制我的代码与非泛型一起运行IEnumerator

.net c# ienumerable ienumerator

8
推荐指数
2
解决办法
1599
查看次数

Visual Studio如何在不侵入其IEnumerator <T>的MoveNext的情况下评估IEnumerable?

假设你为下面的代码编写了一个自定义枚举器:

public class School : IEnumerable<Student>
Run Code Online (Sandbox Code Playgroud)

然后在客户端代码中,您执行了以下操作:

static void Main(string[] args)
{
    var school = CreateSchoolWithStudents();

    var query = from student in school
                where student.Name.StartsWith("S")
                select student;

    Debugger.Break();
}

private static School CreateSchoolWithStudents()
{
    return new School
    {
        new Student { Name = "Sathyaish" },
        new Student { Name = "John" },
        new Student { Name = "Carol" },
        new Student { Name = "Peter" }
    };
}
Run Code Online (Sandbox Code Playgroud)

然后,在类的MoveNext方法实现上设置一个断点StudentEnumerator.

然后,当您运行代码并且在构造查询/ IEnumerable之后调试器中断,并且您Results View在下面显示的图片中展开了类似内容时,Visual Studio如何评估序列而不会破坏其枚举器MoveNext …

c# linq ienumerator enumerator visual-studio

8
推荐指数
1
解决办法
262
查看次数

Unity - IEnumerator的yield返回null

我目前正在尝试在Unity的上下文中理解IEnumerator和Coroutine,并且对"yield return null"执行的内容不太自信.目前我认为它基本上暂停并等待下一帧,并且在下一帧中它将再次执行while语句.

如果我省略"yield return null",它似乎会立即移动到目的地或者"跳过很多帧".所以我想我的问题是在这个while循环中这个"yield return null"函数是如何实现的,为什么有必要这样做.

void Start () {
    StartCoroutine(Move());
}

IEnumerator Move(){

    while (a > 0.5f){

        ... (moves object up/down)

        yield return null; // <---------
    }

    yield return new WaitForSeconds(0.5f);

    .... (moves object up/down)

    StartCoroutine(Move());
}
Run Code Online (Sandbox Code Playgroud)

c# ienumerator yield coroutine unity-game-engine

8
推荐指数
2
解决办法
3万
查看次数

在 Unity 中,我什么时候应该使用协程而不是在 Update() 中减去 Time.deltaTime?

下面是我想强调的差异的一个简单示例。

使用协程:

public float repeatRate = 5f;
void Start()
{
    StartCoroutine("RepeatSomething");
}
IEnumerator RepeatSomething()
{
    while (true)
    {
        yield return new WaitForSeconds(repeatRate);
        // Do something
    }
}
Run Code Online (Sandbox Code Playgroud)

使用Update()Time.deltaTime

public float repeatRate = 5f;
private float timer = 0;
void Update()
{
    if (timer < 0)
    {
        // Do something
        timer = repeatRate;
    }
    timer -= Time.deltaTime;
}
Run Code Online (Sandbox Code Playgroud)

我什么时候应该使用一个而不是另一个,每个的优点/缺点是什么?

c# time ienumerator coroutine unity-game-engine

8
推荐指数
2
解决办法
2411
查看次数

为什么我在实现IEnumerator <T>的类中需要IEnumerator.Current?

我有一个实现的类IEnumerator<string>.见下文:

public class MyClass : IEnumerator<string>
{
    public bool MoveNext()
    {
        //....
    }

    //Implement other required methods....

   //Confusion lies below:
   public string Current { get { return this.CurrentLine; } }

   //Why do I need to implement IEnumerator.Current?!  In my tests, it's not even called    during my iteration
   object IEnumerator.Current { get { throw new NotImplementedException(); } }

}   
Run Code Online (Sandbox Code Playgroud)

除了IEnumerator<T>接口和IEnumerator接口(IEnumerator<T>继承)上都存在.Current属性之外,实现它的重点是什么?如上所述它甚至没有被称为.

.net c# ienumerator

7
推荐指数
1
解决办法
2221
查看次数