LINQ表达式优化语法?

时间:2010-09-30 16:07:08

标签: c# linq .net-4.0

foreach (var item in mainCanvas.Children)
{
    if (item is Button)
    {
        (item as Button).Content = "this is a button";
    }                
}

我可以使用LINQ或.NET 4的其他功能来更简洁(可能是高性能的)吗?

5 个答案:

答案 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我的意思)