相关疑难解决方法(0)

C#中使用的yield关键字是什么?

在" 我如何仅公开IList的片段<>问题"中,其中一个答案包含以下代码段:

IEnumerable<object> FilteredList()
{
    foreach(object item in FullList)
    {
        if(IsItemInPartialList(item))
            yield return item;
    }
}
Run Code Online (Sandbox Code Playgroud)

yield关键字有什么作用?我已经看到它在几个地方被引用,另外一个问题,但我还没弄清楚它实际上做了什么.我习惯于在一个线程产生另一个线程的意义上考虑收益率,但这似乎并不重要.

c# yield

781
推荐指数
16
解决办法
30万
查看次数

使用yield return的IEnumerable和Recursion

我有一个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同时也使用递归的方法?

c# generics ienumerable yield

298
推荐指数
7
解决办法
7万
查看次数

有人可以揭开yield关键字的神秘面纱吗?

我已经看到在Stack Overflow和博客上使用了yield关键字.我不使用LINQ.有人可以解释yield关键字吗?

我知道存在类似的问题.但是没有一个能用简单的语言解释它的用途.

c# language-features yield

28
推荐指数
5
解决办法
4184
查看次数

返回IEnumerable时是否有理由不使用'yield return'?

简单的例子 - 你有一个返回IEnumerable的方法或属性,调用者在foreach()循环中迭代它.你应该总是在你的IEnumerable方法中使用'yield return'吗?有没有理由不去?虽然我明白它可能并不总是有必要,甚至"更好"(例如,它可能是一个非常小的集合),但有没有理由主动避免这样做?

让我思考这个问题的代码是我写的一个函数非常类似于这个帖子中接受的答案 - 我如何遍历日期范围?

c# ienumerable yield-return

22
推荐指数
3
解决办法
4895
查看次数

为什么不能在同一方法中使用"返回"和"收益率"?

为什么我们不能在同一方法中同时使用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)

c# ienumerable return yield-return

21
推荐指数
3
解决办法
5189
查看次数

在Nerd Dinner教程中有趣地使用C#yield关键字

通过一个教程(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,但我想我的理解仍然有点朦胧.它似乎做的是创建一个对象,允许循环遍历集合中的项目而不实际进行循环,除非并且直到它是绝对必要的.

不过,这个例子对我来说有点奇怪.我认为它正在做的是延迟任何 …

c# ienumerable yield

13
推荐指数
2
解决办法
3429
查看次数

Linq 递归求和

我有以下数据结构:

        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)

c# linq recursion

3
推荐指数
1
解决办法
1217
查看次数