c# - 在 Matlab 中迭代 C# 迭代器 (IEnumerable)

标签 c# .net matlab

我有一个返回大量对象的 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 中对此进行迭代,甚至可以“转换”resultIEnumerable<MyClass>在 Matlab 中。

附:

  1. 转换为 Array/IList等由于数据量不可行
  2. 这不是 How can I iterate over a C# IEnumerable in Matlab? 的副本,因为它正在处理 IQueryable具体来说。
  3. 我正在使用 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/

相关文章:

c# - PythonNET DateTime C# .NET List 如何填充它?

c# - 我需要 "transactionScope.Complete();"吗?

matlab - 是否有任何 Matlab 函数可以处理具有连续观测变量的隐马尔可夫模型?

c# - Windows Phone 8.1 将文本复制到剪贴板

C# HttpWebRequest命令获取目录列表

.net - .NET 4.5.x 和 .NET Core 之间有什么区别?

MATLAB:如何在没有循环的情况下计算子矩阵

matlab - 计算并绘制两个点云之间的差异

c# - 请求类在 Razor 页面中不可用

c# - 如何找出托管了哪些 wcf 服务