【问题标题】:How can I iterate over a C# IEnumerable in Matlab?如何在 Matlab 中迭代 C# IEnumerable?
【发布时间】:2011-06-17 16:18:33
【问题描述】:

我尝试使用 Matlab 2010b 访问一些 C# 中的 Linq to SQL 代码。如果我的 Linq 代码返回单个项目实例,我可以在 Matlab 中毫无问题地访问所有属性:

dal = Data.PeopleRepository
person = dal.QueryPersonById(1)
person.Name

ans = 

John Smith

但是,如果我调用一个返回 IQueryable 集合(实际上是 System.Data.Linq.Table 类)的 Linq 查询,我将很难获得其中的 Person 实例列表!

people = dal.QueryAllPeople()

people = 

System.Data.Linq.Table<Data.Person> handle
Package: System.Data.Linq
Properties:
   Context: [1x1 Data.PeopleRepository]
   IsReadOnly: 0

我已尝试使用人员的 GetEnumerator 方法转换为 IEnumerable,但我仍然无法获取内部的实际 Person 实例。 (我知道,由于评估较晚,这些值实际上可能还没有从数据库中检索出来!Aarggh!)任何指针表示赞赏,如果不清楚,请道歉 - 这是我的第一个 StackOverflow 问题......

【问题讨论】:

    标签: .net linq generics matlab ienumerable


    【解决方案1】:

    今天遇到了类似的挑战。确实可以调用扩展方法。但是,语法有点笨拙。

    为了枚举,IEnumerable.ToArray() 扩展方法很方便。对于扩展方法,您需要知道它们是在哪里定义的。在这种情况下,该方法的完整签名是System.Linq.Enumerable.ToArray&lt;T&gt;(this IEnumerable&lt;T&gt;)。 Matlab 不会关心 this 修饰符。但是,因为它是一个 generic 方法,你不能直接在 Matlab 中使用它。相反,NET.invokeGenericMethod 是必需的。

    以下示例枚举双精度数并将结果转换为 Matlab 数组。

    ret = double(NET.invokeGenericMethod('System.Linq.Enumerable', 'ToArray', ...
       {'System.Double'}, enumerableInstance));
    

    因为IQueryable&lt;T&gt; : IEnumerable&lt;T&gt;,同样的方法(ToArray())应该可以完成你的工作。省略到 Matlab 双精度数组的转换,并指定正确的元素类型(我想是Data.Person)。

    为了访问静态 Enumerable 类,Matlab 需要加载一个 .NET 3.0 库。添加

    NET.addAssembly('System.Core');
    

    为此目的。

    【讨论】:

      【解决方案2】:

      我只是反过来使用 Matlab 和 C#(从 C# 调用 Matlab),但在我看来,问题在于您的代码中有一个 IQueryable 实例而不是 IEnumerable。

      尝试调用people = dal.QueryAllPeople().ToList()people = dal.QueryAllPeople.ToArray() - 这将导致执行查询 - 然后数据将有望在 Matlab 中可用。


      更新 - 因为扩展方法是不行的......如果你尝试会发生什么:

      myEnumerator = dal.QueryAllPeople().GetEnumerator()
      myEnumerator.MoveNext()
      firstItem = myEnumerator.Current
      firstItem =
      
      myEnumerator.MoveNext()
      secondItem = myEnumerator.Current
      secondItem =
      

      【讨论】:

      • 不幸的是,这些都不起作用 - 它们都返回错误,“没有适当的方法、属性或字段,'ToList',对于类 'System.Data.Linq.Table'。我认为这些是扩展方法,我猜 Matlab 看不到。嗯,也许我需要在 Matlab 中加载/引用 IEnumerable 接口...
      • 仍然不存在...我 可以 调用:dal.QueryAllPeople().GetEnumerator() 但这没有可用的 ToList() 或 ToArray() 方法,即使在将 System.Core 加载到 Matlab 之后。
      • Aaah - 抱歉 - 当您调用 GetEnumerator(),然后调用 MoveNext(),然后在返回的枚举数上检查 Current 时,究竟会发生什么?如果你能得到Current,那么你可以制作自己的Matlab矩阵或数组。
      • 即代码应该是:等等 - 将其添加到答案中以获得更好的格式!
      • 看准了!当我第一次遇到这个问题时,我什至尝试使用 .Current() ,但只是得到了一个空集。第一个 MoveNext() 是它的关键。非常感谢。 PS我想问你如何从C#调用Matlab,但这可以等另一个问题......(我正在将Matlab编译为C,然后DllImport'ing所需的函数。很痛苦,但Builder NE太贵了)
      猜你喜欢
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2013-11-28
      • 2017-09-30
      • 1970-01-01
      • 2011-06-20
      • 2011-06-20
      • 1970-01-01
      相关资源
      最近更新 更多