产量的用处
Usefulness of yield
我想知道 yield
什么时候有用。在我看来,我可以使用 Linq
每次我可以使用 yield
.
假设我有这个 测试 class
public class Test
{
public object Test1;
public object Test2;
public Test(object test1, object test2)
{
this.Test1 = test1;
this.Test2 = test2;
}
}
还有那两个 DataTable
DataTable dt1 = new DataTable();
dt1.Columns.Add("test1", typeof(string));
dt1.Columns.Add("test2", typeof(string));
dt1.Rows.Add("a1", "a2");
dt1.Rows.Add("b1", "b2");
DataTable dt2 = new DataTable();
dt2.Columns.Add("test1", typeof(string));
dt2.Columns.Add("test2", typeof(string));
dt2.Rows.Add("c1", "c2");
dt2.Rows.Add("d1", "d2");
示例 1
如果我想为 dt1 获得 IEnumerable<Test>
我可以做到
IEnumerable<Test> GetTests(DataTable dt)
{
foreach (DataRow row in dt.Rows)
{
yield return new Test(row["test1"], row["test2"]);
}
}
IEnumerable<Test> tests = GetTests(dt1);
但我可以简单地做
IEnumerable<Test> testsLinq = dt1.Rows.OfType<DataRow>()
.Select(row => new Test(row["test1"], row["test2"]));
示例 2
我知道的另一个yield
用途是合并
IEnumerable<Test> MergeTests(DataTable dt1, DataTable dt2)
{
foreach (DataRow row in dt1.Rows)
{
yield return new Test(row["test1"], row["test2"]);
}
foreach (DataRow row in dt2.Rows)
{
yield return new Test(row["test1"], row["test2"]);
}
}
IEnumerable<Test> mergedTests = MergeTests(dt1, dt2);
不过,我还是可以的
IEnumerable<Test> mergedTestsLinq = dt1.Rows.OfType<DataRow>()
.Select(row => new Test(row["test1"], row["test2"]))
.Union(dt2.Rows.OfType<DataRow>()
.Select(row => new Test(row["test1"], row["test2"])));
是否存在某些我不知道 yield
比 Linq
更适合的情况?
yield return
当数据结构不是线性的时候会灵活很多。
例如,您可以使用它按前序、后序或中序枚举树:
IEnumerable<T> InorderTree<T>(TreeNode<T> node) {
if (node.Left != null) {
foreach (var x in InorderTree(node.Left)) {
yield return x;
}
}
if (node.Right != null) {
foreach (var x in InorderTree(node.Right)) {
yield return x;
}
}
yield return node.Value;
}
您还可以生成一个生成斐波那契数列的方法:
IEnumerable<int> Fibonacci(int n) {
int first = 0, second = 1;
for (int c = 0 ; c < n ; c++ ) {
int next;
if ( c <= 1 ) {
next = c;
} else {
next = first + second;
first = second;
second = next;
}
yield return next;
}
}
我想知道 yield
什么时候有用。在我看来,我可以使用 Linq
每次我可以使用 yield
.
假设我有这个 测试 class
public class Test
{
public object Test1;
public object Test2;
public Test(object test1, object test2)
{
this.Test1 = test1;
this.Test2 = test2;
}
}
还有那两个 DataTable
DataTable dt1 = new DataTable();
dt1.Columns.Add("test1", typeof(string));
dt1.Columns.Add("test2", typeof(string));
dt1.Rows.Add("a1", "a2");
dt1.Rows.Add("b1", "b2");
DataTable dt2 = new DataTable();
dt2.Columns.Add("test1", typeof(string));
dt2.Columns.Add("test2", typeof(string));
dt2.Rows.Add("c1", "c2");
dt2.Rows.Add("d1", "d2");
示例 1
如果我想为 dt1 获得 IEnumerable<Test>
我可以做到
IEnumerable<Test> GetTests(DataTable dt)
{
foreach (DataRow row in dt.Rows)
{
yield return new Test(row["test1"], row["test2"]);
}
}
IEnumerable<Test> tests = GetTests(dt1);
但我可以简单地做
IEnumerable<Test> testsLinq = dt1.Rows.OfType<DataRow>()
.Select(row => new Test(row["test1"], row["test2"]));
示例 2
我知道的另一个yield
用途是合并
IEnumerable<Test> MergeTests(DataTable dt1, DataTable dt2)
{
foreach (DataRow row in dt1.Rows)
{
yield return new Test(row["test1"], row["test2"]);
}
foreach (DataRow row in dt2.Rows)
{
yield return new Test(row["test1"], row["test2"]);
}
}
IEnumerable<Test> mergedTests = MergeTests(dt1, dt2);
不过,我还是可以的
IEnumerable<Test> mergedTestsLinq = dt1.Rows.OfType<DataRow>()
.Select(row => new Test(row["test1"], row["test2"]))
.Union(dt2.Rows.OfType<DataRow>()
.Select(row => new Test(row["test1"], row["test2"])));
是否存在某些我不知道 yield
比 Linq
更适合的情况?
yield return
当数据结构不是线性的时候会灵活很多。
例如,您可以使用它按前序、后序或中序枚举树:
IEnumerable<T> InorderTree<T>(TreeNode<T> node) {
if (node.Left != null) {
foreach (var x in InorderTree(node.Left)) {
yield return x;
}
}
if (node.Right != null) {
foreach (var x in InorderTree(node.Right)) {
yield return x;
}
}
yield return node.Value;
}
您还可以生成一个生成斐波那契数列的方法:
IEnumerable<int> Fibonacci(int n) {
int first = 0, second = 1;
for (int c = 0 ; c < n ; c++ ) {
int next;
if ( c <= 1 ) {
next = c;
} else {
next = first + second;
first = second;
second = next;
}
yield return next;
}
}