Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将这一系列foreach循环转换为LINQ表达式_Linq - Fatal编程技术网

将这一系列foreach循环转换为LINQ表达式

将这一系列foreach循环转换为LINQ表达式,linq,Linq,我有一个通用方法,它使用一系列有效的foreach循环将页面上的所有html控件添加到通用列表中。是否可以将其转换为LINQ表达式 private List<T> GetControls<T>() where T : HtmlControl { List<T> c = new List<T>(); foreach (HtmlControl c1 in Controls)

我有一个通用方法,它使用一系列有效的foreach循环将页面上的所有html控件添加到通用列表中。是否可以将其转换为LINQ表达式

private List<T> GetControls<T>() where T : HtmlControl
         {
            List<T> c = new List<T>();

            foreach (HtmlControl c1 in Controls)
            {
                foreach (HtmlControl c2 in c1.Controls)
                {
                    if (c2.GetType() == typeof(HtmlForm))
                    {
                        foreach (Control c3 in c2.Controls)
                        {
                            if (c3.GetType() == typeof(ContentPlaceHolder))
                            {
                                foreach (HtmlControl c4 in c3.Controls)
                                {
                                    if (c4.GetType() == typeof(T))
                                    {
                                        c.Add((T)c4);
                                    }
                                    if (c4.GetType() == typeof(PlaceHolder))
                                    {
                                        foreach (HtmlControl c5 in c4.Controls)
                                        {
                                            if (c5.GetType() == typeof(T))
                                            {
                                                c.Add((T)c5);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return c;
        }
private List GetControls(),其中T:HtmlControl
{
列表c=新列表();
foreach(控件中的HtmlControl c1)
{
foreach(c1.控件中的HtmlControl c2)
{
if(c2.GetType()==typeof(HtmlForm))
{
foreach(c2.控制中的控制c3)
{
if(c3.GetType()==typeof(ContentPlaceHolder))
{
foreach(c3.控件中的HtmlControl c4)
{
if(c4.GetType()==typeof(T))
{
c、 添加((T)c4);
}
if(c4.GetType()==typeof(占位符))
{
foreach(c4.控件中的HtmlControl c5)
{
if(c5.GetType()==typeof(T))
{
c、 添加((T)c5);
}
}
}
}
}
}
}
}
}
返回c;
}

您可以尝试以下方法:

 private List<T> GetControls<T>() where T : HtmlControl
    {
        List<T> c = new List<T>();

        foreach (HtmlControl c4 in from HtmlControl c1 in Controls
                                   from HtmlControl c2 in c1.Controls
                                   where c2.GetType() == typeof (HtmlForm)
                                   from Control c3 in c2.Controls
                                   where c3.GetType() == typeof (ContentPlaceHolder)
                                   from HtmlControl c4 in c3.Controls
                                   select c4)
        {
            if (c4.GetType() == typeof(T))
            {
                c.Add((T)c4);
            }
            if (c4.GetType() == typeof(PlaceHolder))
            {
                c.AddRange(from HtmlControl c5 in c4.Controls where c5.GetType() == typeof (T) select (T) c5);
            }
        }
        return c;
    }
private List GetControls(),其中T:HtmlControl
{
列表c=新列表();
foreach(控制中的HtmlControl c1中的HtmlControl c4
来自c1.控件中的HtmlControl c2
其中c2.GetType()==typeof(HtmlForm)
来自c2中的控件c3。控件
其中c3.GetType()==typeof(ContentPlaceHolder)
来自c3.控件中的HtmlControl c4
选择c4)
{
if(c4.GetType()==typeof(T))
{
c、 添加((T)c4);
}
if(c4.GetType()==typeof(占位符))
{
c、 AddRange(来自c4.Controls中的HtmlControl c5,其中c5.GetType()==typeof(T)select(T)c5);
}
}
返回c;
}

虽然我不确定它是否更优雅…

你可以试试这样的东西:

 private List<T> GetControls<T>() where T : HtmlControl
    {
        List<T> c = new List<T>();

        foreach (HtmlControl c4 in from HtmlControl c1 in Controls
                                   from HtmlControl c2 in c1.Controls
                                   where c2.GetType() == typeof (HtmlForm)
                                   from Control c3 in c2.Controls
                                   where c3.GetType() == typeof (ContentPlaceHolder)
                                   from HtmlControl c4 in c3.Controls
                                   select c4)
        {
            if (c4.GetType() == typeof(T))
            {
                c.Add((T)c4);
            }
            if (c4.GetType() == typeof(PlaceHolder))
            {
                c.AddRange(from HtmlControl c5 in c4.Controls where c5.GetType() == typeof (T) select (T) c5);
            }
        }
        return c;
    }
private List GetControls(),其中T:HtmlControl
{
列表c=新列表();
foreach(控制中的HtmlControl c1中的HtmlControl c4
来自c1.控件中的HtmlControl c2
其中c2.GetType()==typeof(HtmlForm)
来自c2中的控件c3。控件
其中c3.GetType()==typeof(ContentPlaceHolder)
来自c3.控件中的HtmlControl c4
选择c4)
{
if(c4.GetType()==typeof(T))
{
c、 添加((T)c4);
}
if(c4.GetType()==typeof(占位符))
{
c、 AddRange(来自c4.Controls中的HtmlControl c5,其中c5.GetType()==typeof(T)select(T)c5);
}
}
返回c;
}
虽然我不确定它是否更优雅…

这应该可以:

List<T> c = this.Controls.Cast<Control>()
    .SelectMany(c1 => c1.Controls.Cast<Control>())
    .OfType<HtmlForm>()
    .SelectMany(c2 => c2.Controls.Cast<Control>())
    .OfType<ContentPlaceHolder>()
    .SelectMany(c3 => c3.Controls.Cast<Control>())
    .SelectMany(c4 =>
        {
            if (c4 is T)
                return new[] { (T)c4 };
            if (c4 is PlaceHolder)
                return c4.Controls.Cast<Control>().OfType<T>();
            return Enumerable.Empty<T>();
        })
    .ToList();
List c=this.Controls.Cast()
.SelectMany(c1=>c1.Controls.Cast())
第()类
.SelectMany(c2=>c2.Controls.Cast())
第()类
.SelectMany(c3=>c3.Controls.Cast())
.SelectMany(c4=>
{
如果(c4是T)
返回新的[]{(T)c4};
如果(c4是占位符)
返回c4.Controls.Cast(),类型为();
返回可枚举的.Empty();
})
.ToList();
但是注意,我在这里使用了
is
而不是类型比较。这是经过深思熟虑的,因为这是类型
LINQ方法在内部也使用的

如果你确定你想要的是精确的类型,而不是通过
is
比较的对象,你就必须实现你自己的
类型(或者只使用
。其中(x=>x.GetType==typeof(无论什么))

(还要注意,我使用了
Control
而不是
HtmlControl
,以防您的
HtmlControl
中包含常规的
控件)。

这应该可以做到:

List<T> c = this.Controls.Cast<Control>()
    .SelectMany(c1 => c1.Controls.Cast<Control>())
    .OfType<HtmlForm>()
    .SelectMany(c2 => c2.Controls.Cast<Control>())
    .OfType<ContentPlaceHolder>()
    .SelectMany(c3 => c3.Controls.Cast<Control>())
    .SelectMany(c4 =>
        {
            if (c4 is T)
                return new[] { (T)c4 };
            if (c4 is PlaceHolder)
                return c4.Controls.Cast<Control>().OfType<T>();
            return Enumerable.Empty<T>();
        })
    .ToList();
List c=this.Controls.Cast()
.SelectMany(c1=>c1.Controls.Cast())
第()类
.SelectMany(c2=>c2.Controls.Cast())
第()类
.SelectMany(c3=>c3.Controls.Cast())
.SelectMany(c4=>
{
如果(c4是T)
返回新的[]{(T)c4};
如果(c4是占位符)
返回c4.Controls.Cast(),类型为();
返回可枚举的.Empty();
})
.ToList();
但是注意,我在这里使用了
is
而不是类型比较。这是经过深思熟虑的,因为这是类型
LINQ方法在内部也使用的

如果你确定你想要的是精确的类型,而不是通过
is
比较的对象,你就必须实现你自己的
类型(或者只使用
。其中(x=>x.GetType==typeof(无论什么))

(还请注意,我使用了
Control
而不是
HtmlControl
,以防您的
HtmlControl
s中包含常规的
Control
s。)

设计模式将有助于解开