C# 如何使linq高效
我有一段代码片段,我们从COM Dll中获取一个集合C# 如何使linq高效,c#,linq,C#,Linq,我有一段代码片段,我们从COM Dll中获取一个集合 public BOCollection SelectedObjects{ get { IMSICDPInterfacesLib.IJMonikerElements oIJMonikerElements; oIJMonikerElements = m_oIJSelectSet.Elements as IMSICDPInterfacesLib.IJMonikerElements; BOCollection oBusine
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
public IEnumerable SelectedObjects
为了得到迭代器的优点?还是有别的办法
谢谢
Sunit如果BOCollection实现了IEnumerable,那么您已经获得了迭代器。只需将其放入for或foreach循环。如果BOCollection实现IEnumerable,那么您已经获得了迭代器的优点。只需将其放入for或foreach循环。IEnumerable的问题是肯定的,它将为您提供“Linq goodness”,但它是Linq goodness的最低公分母。最好返回
IList
或甚至IQueryable
(如果可以的话)
例如,如果有人想要获取第4个元素,IEnumerable
如果您已经将对象存储在数组或列表中,则没有意义
要从列表中获取IQueryable
,请执行以下操作:
IQueryable<int> query = list.AsQueryable();
IQueryable query=list.AsQueryable();
IEnumerable的问题是肯定的,它会给你“Linq goodness”,但是Linq goodness的最小公分母。最好返回IList
或甚至IQueryable
(如果可以的话)
例如,如果有人想要获取第4个元素,IEnumerable
如果您已经将对象存储在数组或列表中,则没有意义
要从列表中获取IQueryable
,请执行以下操作:
IQueryable<int> query = list.AsQueryable();
IQueryable query=list.AsQueryable();
是否要返回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>();
}
public IEnumerable GetElements(){
//在这里做一些魔术来确定哪些元素被选中
返回(从e中的e.e.i选择选择e).AsEnumerable();
//这也可能是一个复杂的循环
//while(someCondition()){
//bool-isSelected=false;
//var item=this.allItems[i++];
//复杂的逻辑决定项目是否被选中
//如果(当选){
//收益回报项目;
// }
}
}
public IEnumerable GetSelectedObject(){
返回m_oIJSelectSet.GetElements().Cast();
}
现在,您将拥有完整的延迟执行和LINQ支持。是否要返回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>();
}
public IEnumerable GetElements(){
//在这里做一些魔术来确定哪些元素被选中
返回(从e中的e.e.i选择选择e).AsEnumerable();
//这也可能是一个复杂的循环
//while(someCondition()){
//bool-isSelected=false;
//var item=this.allItems[i++];
//复杂的逻辑决定项目是否被选中
//如果(当选){
//收益回报项目;
// }
}
}
public IEnumerable GetSelectedObject(){
返回m_oIJSelectSet.GetElements().Cast();
}
现在,您将拥有完整的延迟执行和LINQ支持。这与LINQ有什么关系?你没有在任何地方使用linq,只是返回一个集合。我认为他希望在linq查询中使用这个属性的返回值,但是因为它没有实现IEnumerable,所以他不能。这与linq有什么关系?您不在任何地方使用linq,只返回一个集合。我认为他希望在linq查询中使用此属性的返回值,但因为它没有实现IEnumerable,所以他无法控制SelectSet。它由一个服务作为接口IJSelectSet m_oIJSelectSet=(IJSelectSet)oIJDTrader.get_服务(“SelectSet”,”)返回;如前所示,我只能将其强制转换为ijMonitorElements。在这种情况下,因为BOCollection实现了IEnumerable,所以没有太多的更改!啊,我很抱歉,我认为“Now BOCollection确实实现了IEnumerable”是指接口的非通用版本,在这种情况下,您不会得到太多的“LINQ Goods”。顺便说一句,FxCop会因为您从某个属性返回了一个集合而对您大喊大叫。这是一种坏习惯,无法控制选择集。它由一个服务作为接口IJSelectSet m_oIJSelectSet=(IJSelectSet)oIJDTrader.get_服务(“SelectSet”,”)返回;如前所示,我只能将其强制转换为ijMonitorElements。在这种情况下,因为BOCollection实现了IEnumerable,所以没有太多的更改!啊,我很抱歉,我认为“Now BOCollection确实实现了IEnumerable”是指接口的非通用版本,在这种情况下,您不会得到太多的“LINQ Goods”。顺便说一句,FxCop会因为您从某个属性返回了一个集合而对您大喊大叫。这是个坏习惯。