将这一系列foreach循环转换为LINQ表达式
我有一个通用方法,它使用一系列有效的foreach循环将页面上的所有html控件添加到通用列表中。是否可以将其转换为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)
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。)设计模式将有助于解开