小编Des*_*tor的帖子

使用foreach的IndexOutOfRangeException

编辑:查看底部的原因是为什么会发生这种情况

我有一个非常奇怪的IndexOutOfRangeException(如标题中所述).当我使用foreach迭代控件的控件(递归FindControl)时会发生这种情况.

奇怪的错误1

然后我想添加一个额外的检查,确保root.Controls.Count > 0.但是我一直得到异常,而调试器清楚地说Count == 0.

奇怪的错误2

有问题的根是FormView.如果有人有任何想法为什么简单的属性检查抛出IndexOutOfRangeException,请赐教!

异常stackTrace(是的,它是完整的):

   at System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
Run Code Online (Sandbox Code Playgroud)

码:

public static Control FindControlRecursive(this Control root, string id)
{
    if (root.ID == id)
    {
        return root;
    }

    if (root.Controls.Count > 0)
    {
        foreach (Control c in root.Controls)
        {
            Control t = c.FindControlRecursive(id);
            if (t != null)
            {
                return t;
            }
        }
    }

    return null;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我试图使用本机FindControl函数,这会引发相同的错误.


具体问题:

foreach如何在本机集合上抛出IndexOutOfRangeException.


EDIT2:

不知怎的,这似乎与使用ObjectDataSource有关,我没有正确填写输入参数,但我没有得到任何错误.也许这会以某种方式破坏FormView(即使用该数据源).我仍然有兴趣知道在访问childcontrols之前如何在没有错误的情况下发生这种情况.

c# asp.net exception

5
推荐指数
1
解决办法
1105
查看次数

正则表达式而不是string.replace函数

在C#中看过这个用于Regex的CheatSheet

但是,我正在尝试创建一个可以替换它的正则表达式函数:

while (fname.Contains(".."))
{
    fname = fname.Replace("..", ".");
}
if (fname.StartsWith(".")) { 
    fname=  fname.Remove(0, 1);
}
fname = fname.Replace("&", "_");
fname = fname.Replace("#", "_");
fname = fname.Replace("{", "_");
fname = fname.Replace("}", "_");
fname = fname.Replace("%", "_");
fname = fname.Replace("~", "_");
fname = fname.Replace("?", "_");
Run Code Online (Sandbox Code Playgroud)

我根本就没有得到如何编写将为我解决这个问题的正则表达式.任何人都可以帮我一把吗?

c# regex

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

迭代IEnumerable <string>导致严重的性能问题

当我试图迭代IEnumerable类型时,我很少知道for循环的性能发生了什么.

以下是导致严重性能问题的代码

foreach (IEdge ed in edcol)
{
    IEnumerable<string> row = 
        from r in dtRow.AsEnumerable()
        where (((r.Field<string>("F1") == ed.Vertex1.Name) && 
                (r.Field<string>("F2") == ed.Vertex2.Name))
            || ((r.Field<string>("F1") == ed.Vertex2.Name) &&
                (r.Field<string>("F2") == ed.Vertex1.Name)))
        select r.Field<string>("EdgeId");
    int co = row.Count();
    //foreach (string s in row)
    //{

    //}
    x++;
}
Run Code Online (Sandbox Code Playgroud)

上层foreach(eddge中的IEdge)大约需要11000次迭代才能完成.如果我删除该行,它会在几分之一秒内运行

int co = row.Count();
Run Code Online (Sandbox Code Playgroud)

从代码.

row.Count()在所有循环中的最大值为10.

如果我取消注释

//foreach (string s in row)
//{

//}
Run Code Online (Sandbox Code Playgroud)

大约需要10分钟才能完成代码的执行.

IEnumerable类型是否有如此严重的性能问题.??

c# performance

0
推荐指数
1
解决办法
445
查看次数

标签 统计

c# ×3

asp.net ×1

exception ×1

performance ×1

regex ×1