我在iOS设备上收到以下错误:
ExecutionEngineException:在使用--aot-only运行时尝试JIT编译方法'System.Linq.OrderedEnumerable
1<System.Collections.Generic.KeyValuePair
2&gt;:GetEnumerator()'。
我正在使用Unity3D,我知道错误是由于LINQ表达式在编译Unity到iOS时排序值类型有问题。因为(我认为)表达式试图使用反射来实例化实现IComparer&lt; TKey&gt;的新类型。接口。这适用于参考类型,但不适用于Unity iOS版本的值类型。
所以我的想法是,因为我知道在这种情况下,我总是试图订购一系列的整数。我可以绕过通用ICompare&lt; TKey&gt;然后创建我自己的自定义比较器。
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);
答案 0 :(得分:2)
LINQ for Collections的大多数LINQ扩展方法都不能与iOS上的IEnumerables一起使用,因为它们需要不支持的AOT运行时编译器。
但是,Asset Store上有一个类似于LINQ的LINQ for iOS库,但不需要运行时编译器。所以你可以在iOS上使用它。
答案 1 :(得分:1)
这不能直接回答我的问题,但我找到了一种解决方法,
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);
}
答案 2 :(得分:1)
顺便说一句,你的比较被打破了。
读取return (x < y) ? x : y;
您将返回最小的整数,但比较器是提供比较两个对象的结果(读取:对象作为您处理的任何内容,无论是int
,{{1 }或bool
)。
引用MSDN,比较的返回值定义为:
... x是第一个参数。
因此,您的比较应该是string
,否则排序算法永远不会以正确的结果终止(尽管它会检测到太多的迭代并抛出异常,抱怨比较被破坏)。