从列表中选择在成员函数上返回true的所有对象,作为列表?

时间:2013-05-23 20:11:45

标签: c# linq list

我是LINQ的新手并试图抓住它。

到目前为止,对于各种各样的事情,例如减少所需的代码,比如使用.ForEach()在每个对象上运行函数一样,这是非常有用的。

现在我正在尝试从主列表中获取所有对象的列表,当它们的IsMouseOver()函数返回true时。

作为标准foreach,它看起来像这样:

this.m_EntHovered.Clear();
foreach (EntEditor ent in this.m_EntAll)
{
    if (ent.IsMouseOver(mousePos))
        this.m_EntHovered.Add(ent);
}

但是我想用LINQ缩短它,但是我能得到的最短时间并没有太短:

this.m_EntHovered = (from ent in this.m_EntAll
                    where ent.IsMouseOver(input)
                    select ent).ToList<EntEditor>();

有没有更好的方法来实现我所追求的目标或者我做得很好?

1 个答案:

答案 0 :(得分:4)

没有更好的方法可以做到,但你可以通过以下方式更简洁地写出来:

this.m_EntHovered = this.m_EntAll.Where(ent => ent.IsMouseOver(input)).ToList();

请注意,这与原始列表不同,因为您要分配新列表,而不是将项目添加到现有列表中。要获得相同的行为(可能不需要),您可以这样做:

this.m_EntHovered.Clear();
this.m_EntHovered.AddRange(this.m_EntAll.Where(ent => ent.IsMouseOver(input)));