相关疑难解决方法(0)

何时不使用收益率(返回)

这个问题在这里已经有了答案:
在返回IEnumerable时是否有理由不使用'yield return'?

关于这些的好处,这里有几个有用的问题yield return.例如,

我正在寻找关于何时使用的想法yield return.例如,如果我预计需要返回一个集合中的所有项目,它没有看起来就像yield是有用的,对不对?

什么情况下使用yield会限制,不必要,让我陷入困境,或者应该避免?

.net c# yield yield-return

158
推荐指数
8
解决办法
4万
查看次数

收益率很高?

我发现自己经常讨论IEnumerables,以便我可以返回每个结果.有没有办法压缩这样的东西

foreach (var subSelector in subSelectors)
{
    foreach (var node in FindSingle(context, subSelector))
        yield return node;
} 
Run Code Online (Sandbox Code Playgroud)

去除内在的foreach?

c#

53
推荐指数
4
解决办法
2万
查看次数

在ASP.NET中找到控件的更好方法

我有一个复杂的asp.net表单,在一个表单中甚至有50到60个字段Multiview,在MultiView中我有一个GridView,而在GridView中我有几个CheckBoxes.

目前我正在使用该FindControl()方法的链接并检索子ID.

现在,我的问题是,是否有任何其他方法/解决方案可以在ASP.NET中找到嵌套控件.

asp.net findcontrol

46
推荐指数
4
解决办法
10万
查看次数

如何"展开""递归"结构

不知道如何调用它,但是说你有一个类似下面的类:

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)

c# recursion ienumerable

32
推荐指数
2
解决办法
6186
查看次数

枚举本质上不是IEnumerable的集合?

当你想递归枚举一个分层对象,根据一些标准选择一些元素时,有许多技术的例子,如"展平",然后使用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.一个"谦卑"的经历,我可能会补充:)

c# linq treeview ienumerable controlcollection

22
推荐指数
2
解决办法
6761
查看次数

如何在winform中更改文本框的readonly属性false?

我们如何更改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)

c# winforms

4
推荐指数
1
解决办法
1174
查看次数

如何在该ASP.NET页面上的另一个用户控件的事件内找到ASP.NET页面的用户控件编辑:不同的内容占位符?

我有一个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以任何方式找到它们.为什么这样,我怎么能找到它们?

asp.net user-controls findcontrol contentplaceholder

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