在" 我如何仅公开IList的片段<>问题"中,其中一个答案包含以下代码段:
IEnumerable<object> FilteredList()
{
foreach(object item in FullList)
{
if(IsItemInPartialList(item))
yield return item;
}
}
Run Code Online (Sandbox Code Playgroud)
yield关键字有什么作用?我已经看到它在几个地方被引用,另外一个问题,但我还没弄清楚它实际上做了什么.我习惯于在一个线程产生另一个线程的意义上考虑收益率,但这似乎并不重要.
我有一个IEnumerable<T>方法,我用来在WebForms页面中找到控件.
该方法是递归的,当返回yield return递归调用的值时,我遇到一些问题,返回我想要的类型.
我的代码如下:
public static IEnumerable<Control>
GetDeepControlsByType<T>(this Control control)
{
foreach(Control c in control.Controls)
{
if (c is T)
{
yield return c;
}
if(c.Controls.Count > 0)
{
yield return c.GetDeepControlsByType<T>();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这当前抛出"无法转换表达式类型"错误.但是IEnumerable<Object>,如果此方法返回类型,则代码构建,但输出中返回错误的类型.
有没有使用yield return同时也使用递归的方法?
我已经看到在Stack Overflow和博客上使用了yield关键字.我不使用LINQ.有人可以解释yield关键字吗?
我知道存在类似的问题.但是没有一个能用简单的语言解释它的用途.
简单的例子 - 你有一个返回IEnumerable的方法或属性,调用者在foreach()循环中迭代它.你应该总是在你的IEnumerable方法中使用'yield return'吗?有没有理由不去?虽然我明白它可能并不总是有必要,甚至"更好"(例如,它可能是一个非常小的集合),但有没有理由主动避免这样做?
让我思考这个问题的代码是我写的一个函数非常类似于这个帖子中接受的答案 - 我如何遍历日期范围?
为什么我们不能在同一方法中同时使用return和yield return?
例如,我们可以在下面使用GetIntegers1和GetIntegers2,但不能使用GetIntegers3.
public IEnumerable<int> GetIntegers1()
{
return new[] { 4, 5, 6 };
}
public IEnumerable<int> GetIntegers2()
{
yield return 1;
yield return 2;
yield return 3;
}
public IEnumerable<int> GetIntegers3()
{
if ( someCondition )
{
return new[] {4, 5, 6}; // compiler error
}
else
{
yield return 1;
yield return 2;
yield return 3;
}
}
Run Code Online (Sandbox Code Playgroud) 通过一个教程(Professional ASP.NET MVC - Nerd Dinner),我遇到了这段代码:
public IEnumerable<RuleViolation> GetRuleViolations() {
if (String.IsNullOrEmpty(Title))
yield return new RuleViolation("Title required", "Title");
if (String.IsNullOrEmpty(Description))
yield return new RuleViolation("Description required","Description");
if (String.IsNullOrEmpty(HostedBy))
yield return new RuleViolation("HostedBy required", "HostedBy");
if (String.IsNullOrEmpty(Address))
yield return new RuleViolation("Address required", "Address");
if (String.IsNullOrEmpty(Country))
yield return new RuleViolation("Country required", "Country");
if (String.IsNullOrEmpty(ContactPhone))
yield return new RuleViolation("Phone# required", "ContactPhone");
if (!PhoneValidator.IsValidNumber(ContactPhone, Country))
yield return new RuleViolation("Phone# does not match country", "ContactPhone");
yield break;
}
Run Code Online (Sandbox Code Playgroud)
我已经读过了yield,但我想我的理解仍然有点朦胧.它似乎做的是创建一个对象,允许循环遍历集合中的项目而不实际进行循环,除非并且直到它是绝对必要的.
不过,这个例子对我来说有点奇怪.我认为它正在做的是延迟任何 …
我有以下数据结构:
List<Item> Items = new List<Item>
{
new Item{ Id = 1, Name = "Machine" },
new Item{ Id = 3, Id_Parent = 1, Name = "Machine1"},
new Item{ Id = 5, Id_Parent = 3, Name = "Machine1-A", Number = 2, Price = 10 },
new Item{ Id = 9, Id_Parent = 3, Name = "Machine1-B", Number = 4, Price = 11 },
new Item{ Id = 100, Name = "Item" } ,
new Item{ Id = 112, Id_Parent = …Run Code Online (Sandbox Code Playgroud)