在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; 您返回的是最小的整数,但是比较器是提供比较两个对象的结果(读取:作为您处理的任何对象,无论是intbool还是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); }