foreach (var item in mainCanvas.Children)
{
if (item is Button)
{
(item as Button).Content = "this is a button";
}
}
我可以使用LINQ或.NET 4的其他功能来更简洁(可能是高性能的)吗?
答案 0 :(得分:12)
您可以使用Enumerable.OfType
:
foreach (var button in mainCanvas.Children.OfType<Button>())
{
button.Content = "this is a button";
}
效果衡量指标
方法1 :OPs原始建议
foreach (var item in mainCanvas.Children)
{
if (item is Button)
{
(item as Button).Content = "this is a button";
}
}
方法2 :OfType
foreach (var button in mainCanvas.Children.OfType<Button>())
{
button.Content = "this is a button";
}
方法3 :仅投一次
foreach (var item in mainCanvas.Children)
{
Button button = item as Button;
if (button != null)
{
button.Content = "this is a button";
}
}
方法4 :for循环:
List<object> children = mainCanvas.Children;
for (int i = 0; i < children.Count; ++i)
{
object item = children[i];
if (item is Button)
{
(item as Button).Content = "this is a button";
}
}
<强>结果
Iterations per second Method 1: 18539180 Method 2: 7376857 Method 3: 19280965 Method 4: 20739241
<强>结论强>
for
循环代替foreach
可以获得最大的改进。OfType
要慢得多。但请记住首先优化可读性,并且只有在性能分析下才会优化性能,并发现此特定代码是性能瓶颈。
答案 1 :(得分:3)
一行应该这样做
mainCanvas.Children.OfType<Button>.ToList().ForEach(b => b.Content = "this is a button");
答案 2 :(得分:1)
查看是否有OfType<T>
分机。
foreach (var item in mainCanvas.Children.OfType<Button>())
{
item.Content = "this is a button";
}
如果没有,您可以使用:
foreach (var item in mainCanvas.Children.Where(item=>item is Button).Cast<Button>())
{
item.Content = "this is a button";
}
答案 3 :(得分:1)
并不是说它特别优越,但这种语法有一些不错的东西:
使用LINQ和Microsoft ReactiveExtensions框架
mainCanvas.Children
.OfType<Button>()
.Do(b => b.Content = "I'm a button!")
.Run();
答案 4 :(得分:1)
要仅迭代集合中的实际按钮,您可以执行以下操作:
foreach(Button button in mainCanvas.Children)
button.Content = "this is a button";
据我了解,这是语法糖,可以转换为上面的方法4。但请不要引用我的话。 (编辑:方法3我的意思)