【问题标题】:C# OrderBy and iOS gives JIT errorC# OrderBy 和 iOS 给出 JIT 错误
【发布时间】:2014-10-31 10:34:34
【问题描述】:

我正在尝试使用此行重新排序字典:

var orderedPairs = myturn.OrderBy(pair => pair.Value.Get<string>("lastMoveTime")).Select(pair => pair.Value);

它在编辑器中完美运行,但在编译到 iOS 时出现此错误:

ExecutionEngineException:在使用 --aot-only 运行时尝试 JIT 编译方法 'System.Linq.OrderedEnumerable1&lt;System.Collections.Generic.KeyValuePair2>:GetEnumerator ()'。

我如何通过这个?有什么想法吗?还有其他方法可以重新排序字典吗?

任何帮助表示赞赏并提前致谢。

****************************** 编辑 ******************** ***

我正在尝试让 Bunny83 的方法起作用,但我有点不知所措。我做了以下事情:

public class MyClass
{
    //public string lastMoveTime{ set; get; }
}

List<MyClass> orderedList = myturn.Values;
orderedList.Sort((e1,e2) => e1.lastMoveTime.CompareTo(e2.lastMoveTime));

我的问题是。正如我所看到的,我将整个 ParseObject 放入 MyClass 中,但我不知道如何从中获取 lastMoveTime 进行比较。

其次,如果它有效。之后如何以有序的方式将所有内容重新放入我的字典中?

仍然希望得到帮助并提前感谢:-)

【问题讨论】:

    标签: c# ios xcode linq unity3d


    【解决方案1】:

    使用我的库怎么样,UniLinq

    这是 Unity GameEngine 上的 LINQ to Objects 的类库,没有异常相关的 AOT 编译。(但现在,这个库是 Beta 版)

    这个库基于比 Unity 使用的新的 mono 类库。 我为 Unity 的单声道编译器更改了一些代码。

    当我们为 OrderBy、ThenBy 等使用 Unity 默认类时,在某些情况下可能会引发异常。 并且我修复了一些使用 UniLinq 的异常情况。

    请尝试UniLinq

    【讨论】:

      【解决方案2】:

      OrderBy 将无法在 iOS 上运行,因为存在一些编译限制。这个库可能会有所帮助:https://www.assetstore.unity3d.com/en/#!/content/18131

      【讨论】:

        【解决方案3】:

        嗯,问题是当使用 OrderBy 时会创建一个名为“OrderedEnumerable”的内部通用类的实例。这种类型的具体版本不会提前创建,因为它仅在像 OrderBy 这样的方法中使用,并且 AOT 编译器在创建依赖关系树时似乎不包含扩展方法。因此,您的泛型参数的具体类 OrderedEnumerable 不会提前创建,因此运行时必须 jit 编译,这在 iOS 上不起作用。

        通常的解决方案是在项目的某处手动创建该类型的实例,以便编译器为您创建该类。但是,由于 OrderedEnumerable 是一个内部类,我看不到强制编译该类的方法。

        由于您对字典“键”不感兴趣,因此您可以简单地将“值”转换为通用列表并对该列表进行排序:

        List<YourClass> orderedList = myturn.Values.ToList();
        orderedList.Sort((e1,e2) => e1.Get<string>("lastMoveTime").CompareTo(e2.Get<string>("lastMoveTime")));
        

        这应该为您提供一个“YourClass”类型的有序列表,该列表按您的类的 Get 方法返回的值排序。这也应该适用于 AOT 平台。但是我没有一个仅用于测试它的设备。

        编辑

        为了澄清一点:我的示例中的“YourClass”应该替换为字典中的类。您没有包括如何声明您的字典,但是由于您在其上调用了一个名为“Get”的通用方法,因此我得出结论,您的字典包含某种类/结构作为值。您的 Linq 行仅返回字典的值并忽略键。您根据 Get 方法的返回值对“值”进行了排序。

        我所做的是将字典中的所有 value.elements 复制到单独的列表中。当然,该列表需要属于您的班级类型。通用 List 有一个内置的 Sort method,您可以传递一个 Comparison 委托来指定如何对列表中的项目进行排序。因为在您的原始代码中,您按Get&lt;string&gt;("lastMoveTime") 的返回值排序,所以我也这样做了。在比较委托中,我只是从两个元素中获取该值并将它们相互比较。

        执行排序后,列表将包含所有按您希望的方式排序的类/结构。

        【讨论】:

        • 我正在努力让它工作,但我有点过头了:-/
        猜你喜欢
        • 1970-01-01
        • 2014-12-28
        • 2014-02-04
        • 2013-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-31
        相关资源
        最近更新 更多