yield return用法

29 浏览
0 Comments

yield return用法

哪种方法更好?如果是第二种方法,你能展示一下yield return的真实使用证明吗?\n方法1:\n

class myClass
{
   List _list;
   IENumerator GetEnumerator()
   {
      foreach(SomeType t in _list)
        yield return t;
   }
}
myClass m = new myClass();
List list;
...
foreach(SomeType t in m)
  list.Add(t);

\n方法2:\n

class myClass
{
    public List _list {get; private set;}
}
myClass m = new myClass();
...
List list = m.list;

\n哪种方法更好?如果是第二种方法,你能展示一下yield return的真实使用证明吗?

0
0 Comments

yield return 使用的原因是为了实现一个生成器函数,可以按需生成序列中的元素,而不必一次性生成整个序列。在FibonnaciSeries函数中,使用yield return来生成斐波那契数列中的每一个数字。

yield return 的解决方法是使用迭代器实现生成器函数。通过在函数中使用yield return语句,可以将函数转换为一个迭代器,每次调用迭代器的MoveNext()方法时,都会执行函数中的代码,直到遇到yield return语句,该语句会返回一个值,并暂停函数的执行,直到下一次调用MoveNext()方法。

这样,我们就可以通过迭代器逐个生成斐波那契数列中的数字,而不必一次性生成整个序列。这对于处理大型序列或者需要按需生成序列的场景非常有用。

虽然斐波那契数列可能不是实际开发中经常使用的算法,但使用yield return可以灵活地生成各种类型的序列,而不仅限于斐波那契数列。

0
0 Comments

yield return的使用出现的原因是因为有些情况下需要生成器,需要在需要时生成下一个项。例如,一个随机数生成器可以在你不停地要求它时提供另一个随机数。它可能没有结束,但你可能不知道开始之前有多少个数字。

另一个常见的用法是从某个外部来源检索数据。例如,从一个Web服务中获取项目列表。在这种情况下,你可能不知道有多少项,并且可能不知道实际上需要多少项(因为可能要在无限显示中显示一个)。在这种情况下,可以这样实现:

IEnumerable GetItems()
{
    while (Service.HasMorePages())
    {
        foreach (Item item in Service.GetNextPage())
        {
            yield return item;
        }
    }
    yield break;
}

`GetNextPage`总是一次返回一个包含N个项的列表,当你需要更多的项时,可以获取下一个。

yield return的解决方法是使用适当的语法和控制流结构来实现所需的逻辑。使用yield return关键字可以创建一个生成器函数,它可以按需生成一个序列的值。这个生成器函数可以通过迭代的方式返回值,而不需要一次性生成所有的值。这样可以节省内存,并且可以在需要时按需生成值。

0
0 Comments

yield return语句的使用是为了解决以下问题:

1. 一个类具有一个集合属性时,通常最好将其实现为一个列表,以便可以多次迭代和修改。但是对于一个枚举器而言,这是不可能的,因为枚举器只代表一个序列。

2. 枚举器的典型用途可能包括:

- 在运行时过滤数据(例如Enumerable.Where

- 从包含多个记录的文件中顺序读取单个项,而无需一次性加载所有记录,例如网络套接字或数据库服务器。

- 提供一个只能向前读取的、只读的包装器,用于对数据序列的操作等。

由于枚举器表示的是一个序列,它不能被多次迭代和修改,因此yield return语句的出现就是为了解决这个问题。

解决方法:使用yield return语句可以将一个方法转换为一个迭代器块,使得可以在方法中使用yield return语句来返回序列中的每个元素。这样,就可以通过多次调用迭代器来遍历序列,而无需一次性加载所有元素。这种方法可以有效地处理大型数据集或流数据,同时节省内存和提高性能。

0