Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使linq高效_C#_Linq - Fatal编程技术网

C# 如何使linq高效

C# 如何使linq高效,c#,linq,C#,Linq,我有一段代码片段,我们从COM Dll中获取一个集合 public BOCollection SelectedObjects{ get { IMSICDPInterfacesLib.IJMonikerElements oIJMonikerElements; oIJMonikerElements = m_oIJSelectSet.Elements as IMSICDPInterfacesLib.IJMonikerElements; BOCollection oBusine

我有一段代码片段,我们从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
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会因为您从某个属性返回了一个集合而对您大喊大叫。这是个坏习惯。