我有一个返回大量对象的 C# 方法。这将在 Matlab 中使用。
namespace MyNameSpace{
public static class MyClass{
public static IEnumerable<MyDataObject> GetVeryLargeResponse(){
while(CheckForSomeFunkyConditionThatsRarelyTrue()){
yield return GetMyNextDataObject();
}
yield break;
}
}
}
当我打电话时在 Matlab 中
result = MyClass.GetVeryLargeResponse();
我希望结果的类型是 IEnumerable<MyDataObject>
, 以便能够得到 Enumerator<MyDataObject>
调用result.GetEnumerator()
.
我要去哪里 result
这是类型 MyNameSpace.<GetVeryLargeResponse>d_3
没有GetEnumerator()
可用的方法。我确实看到了 result
之一的父类(super class)是 System.Collections.Generic.IEnumerable<MyClass>
.
有没有一种方法可以让我在 Matlab 中对此进行迭代,甚至可以“转换”result
至 IEnumerable<MyClass>
在 Matlab 中。
附:
- 转换为
Array
/IList
等由于数据量不可行 - 这不是 How can I iterate over a C# IEnumerable in Matlab? 的副本,因为它正在处理
IQueryable
具体来说。 - 我正在使用 Matlab 2010b
最佳答案
结果确实有一个GetEnumerator()
方法——它只是可以通过显式接口(interface)实现来实现。
如果 Matlab 不愿意处理,您可以随时编写自己的映射类型和扩展方法来简化事情:
public static class Extensions
{
public static EnumerableWrapper<T> Wrap<T>(this IEnumerable<T> source)
{
return new EnumerableWrapper<T>(source);
}
}
public class EnumerableWrapper<T> : IEnumerable<T>
{
private readonly IEnumerable<T> source;
public EnumerableWrapper(IEnumerable<T> source)
{
this.source = source;
}
public IEnumerator<T> GetEnumerator()
{
return new EnumeratorWrapper<T>(source.GetEnumerator());
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public class EnumeratorWrapper<T> : IEnumerator<T>
{
private readonly IEnumerator<T> source;
public EnumeratorWrapper(IEnumerator<T> source)
{
this.source = source;
}
public T Current { get { return source.Current; } }
object IEnumerator.Current { get { return Current; } }
public bool MoveNext()
{
return source.MoveNext();
}
public void Reset()
{
source.Reset();
}
public void Dispose()
{
source.Dispose();
}
}
然后尝试:
result = MyClass.GetVeryLargeResponse().Wrap();
尽管 Matlab 不支持开箱即用,这似乎很奇怪......
关于c# - 在 Matlab 中迭代 C# 迭代器 (IEnumerable),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6614040/