在iOS上使用C#的LINQ OrderBy的JIT错误
我在iOS设备上收到以下错误消息:
ExecutionEngineException:试图JIT编译方法'System.Linq.OrderedEnumerable
1<System.Collections.Generic.KeyValuePair
2>:GetEnumerator()',而运行时使用 – 仅 – 只。
我正在使用Unity3D,而且我知道这个错误是由于LINQexpression式在编译Unity到iOS时对sorting值types有问题而引起的。 因为(我认为)expression式试图使用reflection来实例化一个实现IComparer <TKey>接口的新types。 这将适用于引用types,但不适用于Unity iOS构build的值types。
所以我的想法是,因为我知道在这种情况下,我总是试图订购一个整数集合。 我可以绕过通用的ICompare <TKey>,并创build自己的自定义比较器。
public class IntCompare : Comparer<int> { public override int Compare (int x, int y) { return x - y; } }
但是,使用OrderBy仍然给我错误。 有什么我不明白为什么我的方法不工作?
我的表情:
OptimizeMaxCommitList(members .OrderBy((memberid) => memberid.Value, new IntCompare()) .Skip(1) .ToDictionary(pair => pair.Key, pair => pair.Value) ,maxCommit);
大多数来自LINQ for Collections的LINQ扩展方法都不适用于iOS上的IEnumerables,因为它们需要不受支持的AOT运行时编译器。
但是在Asset Store上有一个类似于LINQ的iOS库,它不需要运行时编译器。 所以你可以在iOS上使用它。
顺便说一句,你的比较是坏的。
读return (x < y) ? x : y;
return (x < y) ? x : y;
您返回的是最小的整数,但是比较器是提供比较两个对象的结果(读取:作为您处理的任何对象,无论是int
, bool
还是string
)。
引用MSDN ,比较的返回值被定义为:
- 小于零 :x小于y。
- 零 :x等于y。
- 大于零 :x大于y。
…是第一个参数。
因此,你的比较应该读return x - y;
或者sortingalgorithm永远不会终止正确的结果(虽然它会检测太多的迭代,并抛出一个exception,抱怨比较被打破)。
这不直接回答我的问题,但我find了一个解决方法,
members = sortDictionary(members); OptimizeMaxCommitList(members .Skip(1) .ToDictionary(pair => pair.Key, pair => pair.Value), maxCommit);
private Dictionary<string, int> sortDictionary(Dictionary<string, int> members) { List<KeyValuePair<string, int>> list = members.ToList(); list.Sort((firstPair,nextPair) => { return firstPair.Value.CompareTo(nextPair.Value); } ); return list.ToDictionary((keyItem) => keyItem.Key, (valueItem) => valueItem.Value); }