如何使用LINQ更改多个对象中的相同属性?

时间:2013-05-15 16:24:42

标签: c# performance linq

    private void AllowOtherSelectors(bool value)
    {
        foreach (var c in this.Parent.Controls)
        {
            if (c == this)
                continue;
            if (!(c is RoundGroupedSelector))
                continue;
            var rgs = c as RoundGroupedSelector;

            rgs.AllowMultiple = value;
        }
    }

虽然这段代码有效但我觉得它可以从使用LINQ中受益。该程序将在具有Atom处理器的平板电脑上使用,因此我只是在寻找所使用的资源/周期最少。

2 个答案:

答案 0 :(得分:11)

好吧,我仍然使用foreach循环,但你可以使用LINQ作为查询部分:

foreach (var c in Parent.Controls
                        .OfType<RoundGroupedSelector>()
                        .Where(x => x != this))
{
    c.AllowMultiple = value;
}

答案 1 :(得分:1)

我肯定会选择Jon的答案,但只是为了解决你对“使用的最少周期”这一点的看法,你可能会让它更快一点:

private void AllowOtherSelectors(bool value)
{
    var saved = this.AllowMultiple;

    foreach (var c in this.Parent.Controls)
    {
        var rgs = c as RoundGroupedSelector;

        if (rgs != null)
            rgs.AllowMultiple = value;
    }

    this.AllowMultiple = saved;
}

我通过在循环之前复制if (c == this)并在之后恢复它来避免每次迭代this.AllowMultiple次测试。我还删除了is的多余使用。

如果有很多控件并且this.AllowMultiple分配非常快且没有副作用,这只会加快速度。

我必须强调,这种微优化通常是毫无意义的,如果你做这种事情,你必须检测它,看它是否真的更快。

我在这里发帖只是为了感兴趣。我绝对不是在暗示你应该这样做! :)