我有这段代码片段,我们从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
为了获得迭代器的好处?或者还有另一种方式吗?
感谢 苏尼特
答案 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();