如何使这个linq高效

时间:2009-04-16 18:31:39

标签: c# linq

我有这段代码片段,我们从COM Dll获取一个集合

 public BOCollection SelectedObjects{
get
{
    IMSICDPInterfacesLib.IJMonikerElements oIJMonikerElements;
    oIJMonikerElements = m_oIJSelectSet.Elements as IMSICDPInterfacesLib.IJMonikerElements;
    BOCollection oBusinessObjects = new BOCollection(oIJMonikerElements);
    return oBusinessObjects;
}

}

现在BOCollection确实实现了IEnumerable。那么将它改为

会更好吗?
public IEnumerable<BusinessObject> SelectedObjects

为了获得迭代器的好处?或者还有另一种方式吗?

感谢 苏尼特

3 个答案:

答案 0 :(得分:1)

您是否想要返回IEnumerable以便延迟执行?首先,你不想在房产中做这件事,因为我相信FxCop会为此大喊大叫。以下是我建议您更改内容的方法,以便您可以从延迟执行和LINQ中受益。

将m_oIJSelectSet.Elements属性更改为返回IEnumerable的方法,如下所示:

public IEnumerable<IJMonikeElements> GetElements() {
    // Do some magic here to determine which elements are selected
    return (from e in this.allElements where e.IsSelected select e).AsEnumerable();

//  This could also be a complicated loop
//  while (someCondition()) {
//      bool isSelected = false;
//      var item = this.allItems[i++];

        // Complicated logic determine if item is selected
//      if (isSelected) {
//          yield return item;
//      }
    }
}

public IEnumerable<BusinessObject> GetSelectedObjects() {
    return m_oIJSelectSet.GetElements().Cast<BusinessObject>();
}

现在,您将拥有完整的延迟执行和LINQ支持。

答案 1 :(得分:0)

如果BOCollection实现IEnumerable,那么你已经获得了迭代器的优点。把它扔进for或foreach循环。

答案 2 :(得分:0)

IEnumerable<T>的问题是肯定的,它会给你“Linq的善意”,但是Linq善良的最低共同点。最好返回IList<T>甚至IQueryable<T>(如果可以的话)。

例如,如果有人想获得第4个元素,如果您已经将对象存储在数组或列表中,则IEnumerable<T>没有意义。

要从IQueryable<T>获取List<T>,请执行以下操作:

IQueryable<int> query = list.AsQueryable();