这个问题在这里已经有了答案:
在返回IEnumerable时是否有理由不使用'yield return'?
关于这些的好处,这里有几个有用的问题yield return.例如,
我正在寻找关于何时不使用的想法yield return.例如,如果我预计需要返回一个集合中的所有项目,它没有看起来就像yield是有用的,对不对?
什么情况下使用yield会限制,不必要,让我陷入困境,或者应该避免?
我发现自己经常讨论IEnumerables,以便我可以返回每个结果.有没有办法压缩这样的东西
foreach (var subSelector in subSelectors)
{
foreach (var node in FindSingle(context, subSelector))
yield return node;
}
Run Code Online (Sandbox Code Playgroud)
去除内在的foreach?
我有一个复杂的asp.net表单,在一个表单中甚至有50到60个字段Multiview,在MultiView中我有一个GridView,而在GridView中我有几个CheckBoxes.
目前我正在使用该FindControl()方法的链接并检索子ID.
现在,我的问题是,是否有任何其他方法/解决方案可以在ASP.NET中找到嵌套控件.
不知道如何调用它,但是说你有一个类似下面的类:
class Person
{
public string Name;
public IEnumerable<Person> Friends;
}
Run Code Online (Sandbox Code Playgroud)
然后你有一个人,你想要递归地"展开"这个结构,所以你最终得到一个没有重复的所有人的列表.
你会怎么做?我已经做了一些似乎有用的东西,但我很想知道其他人会怎么做,特别是如果Linq内置了一些内容你可以巧妙地使用它来解决这个小问题:)
这是我的解决方案:
public static IEnumerable<T> SelectRecursive<T>(this IEnumerable<T> subjects, Func<T, IEnumerable<T>> selector)
{
// Stop if subjects are null or empty
if(subjects == null)
yield break;
// For each subject
foreach(var subject in subjects)
{
// Yield it
yield return subject;
// Then yield all its decendants
foreach (var decendant in SelectRecursive(selector(subject), selector))
yield return decendant;
}
}
Run Code Online (Sandbox Code Playgroud)
将使用这样的东西:
var people = somePerson.SelectRecursive(x => x.Friends);
Run Code Online (Sandbox Code Playgroud) 当你想递归枚举一个分层对象,根据一些标准选择一些元素时,有许多技术的例子,如"展平",然后使用Linq进行过滤:如下所示:
但是,当您枚举类似Form的Controls集合或TreeView的Nodes集合时,我一直无法使用这些类型的技术,因为它们似乎需要一个参数(对于扩展方法),这是一个IEnumerable集合:传入SomeForm.Controls不编译.
我发现最有用的是:
哪个为您提供Control.ControlCollection的扩展方法,其中包含IEnumerable结果,然后您可以使用Linq.
我修改了上面的例子来解析TreeView的节点没有问题.
public static IEnumerable<TreeNode> GetNodesRecursively(this TreeNodeCollection nodeCollection)
{
foreach (TreeNode theNode in nodeCollection)
{
yield return theNode;
if (theNode.Nodes.Count > 0)
{
foreach (TreeNode subNode in theNode.Nodes.GetNodesRecursively())
{
yield return subNode;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我现在使用扩展方法编写的代码:
var theNodes = treeView1.Nodes.GetNodesRecursively();
var filteredNodes =
(
from n in theNodes
where n.Text.Contains("1")
select n
).ToList();
Run Code Online (Sandbox Code Playgroud)
而且我认为在传递约束的地方可能会有更优雅的方法.
我想知道是否可以一般性地定义这样的过程,以便:在运行时我可以将集合类型以及实际集合传递给泛型参数,因此代码与是否无关它是TreeNodeCollection或Controls.Collection.
我还有兴趣知道是否有任何其他方式(更便宜?fastser?)比第二个链接(上面)中所示,以获得Linq可用的形式的TreeNodeCollection或Control.ControlCollection.
Leppie关于'在第一个(上图)链接的SO帖子中的SelectMany的评论似乎是一个线索.
我对SelectMany的实验是:好吧,称之为"灾难".:)
感谢任何指针.我已经花了几个小时阅读我发现的那些触及这些区域的SO帖子,然后漫无目的地进入像"y-combinator"这样的exotica.一个"谦卑"的经历,我可能会补充:)
我们如何更改winform中所有textBox的ReadOnly属性为true,我尝试使用此代码,但这提示我对象null引用错误...
private void TextBoxesReadOnlyTrue(Control.ControlCollection cc)
{
foreach (Control ctrl in cc)
{
TextBox tb = ctrl as TextBox;
if (tb.ReadOnly)
{
tb.ReadOnly = false;
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个ASP.NET页面,注册了2个用户控件.第一个只有一个按钮.第二个是简单文本,默认隐藏.我想要的是在单击第一个按钮时(即按钮单击事件)使第二个可见.
ASP.NET页面:
<%@ Page Title="" Language="C#" CodeFile="test.aspx.cs" Inherits="test" %>
<%@ Register Src="~/UC_button.ascx" TagName="button" TagPrefix="UC" %>
<%@ Register Src="~/UC_text.ascx" TagName="text" TagPrefix="UC" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MyTestContent" Runat="Server">
<UC:button ID="showbutton1" runat="server" />
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MyTestContent2" Runat="Server">
<UC:text runat="server" Visible="false" ID="text1" />
</asp:Content>
Run Code Online (Sandbox Code Playgroud)
UC_Button.ascx.cs:
protected void button1_Click(object sender, EventArgs e)
{
Button btnSender = (Button)sender;
Page parentPage = btnSender.Page;
UserControl UC_text = (UserControl)parentPage.FindControl("text1");
UC_text.Visible = true;
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我Object reference not set to an instance of an object.在代码的最后一行得到了众所周知的错误.
编辑:
首次发布此内容时,我忘记提及一件事.用户控件在不同的<asp:Content></asp:Content>控件中(我编辑了上面的示例).如果我把它们放在相同的占位符代码中工作就好了.如果我将它们放在单独的内容占位符中,我无法使用findcontrol以任何方式找到它们.为什么这样,我怎么能找到它们?
c# ×5
asp.net ×2
findcontrol ×2
ienumerable ×2
.net ×1
linq ×1
recursion ×1
treeview ×1
winforms ×1
yield ×1
yield-return ×1