2013-05-10 74 views
7
C#JIT錯誤

我收到我的iOS裝置上以下錯誤:使用LINQ排序依據在iOS

ExecutionEngineException:試圖JIT編譯方法「System.Linq.OrderedEnumerable 1<System.Collections.Generic.KeyValuePair 2>:的GetEnumerator() '而運行 - 只 - 只。

我使用的是Unity3D,我知道這個錯誤是由於LINQ表達式在編譯Unity到iOS時對排序值類型有問題導致的。因爲(我認爲)該表達式嘗試使用反射來實例化一個實現IComparer接口的新類型。這將適用於參考類型,但不適用於Unity iOS構建的值類型。

所以我的想法是,因爲我知道在這種情況下,我總是試圖訂購一個整數集合。我可以繞過通用的ICompare < TKey>並創建我自己的自定義比較器。

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); 
+1

我知道這是不相關的,但這是一個寫得很好的問題;你不僅解釋了你想要做的事情,而且還解釋了你的理由,假設和先前的方法。 +1艘遊艇。 – 2013-05-10 17:20:10

+1

爲什麼不編寫你自己的OrderBy擴展方法並且解決LINQ的那部分問題呢?最糟糕的情況是,使用預集合的方法來避免這個關鍵部分中的工作值類型 – 2013-05-10 19:46:37

+0

這就是我最終做的事,謝謝! – MichaelTaylor3D 2013-05-13 14:14:43

回答

2

LINQ for Collections的大多數LINQ擴展方法都不適用於iOS上的IEnumerables,因爲它們需要不受支持的AOT運行時編譯器。

但Asset Store上有一個LINQ for iOS庫,與LINQ類似,但不需要運行時編譯器。所以你可以在iOS上使用它。

+0

太棒了,當我最初提出這個問題時,這個問題並沒有解決,但它卻是一個很好的解決方案。 – MichaelTaylor3D 2014-07-14 12:55:37

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); 
} 
+0

這工作對我來說,拯救了我的一天:) – Xtro 2014-10-27 20:12:57

1

順便說一句,你的比較破碎。

閱讀return (x < y) ? x : y;要返回最小的整數,但是一個比較器是提供比較兩個對象的結果(閱讀:對象的事情你處理,無論是intboolstring)。

引用MSDN,比較的返回值被定義爲:

  • 小於零:x是小於y。
  • :x等於y。
  • 大於零:x大於y。

...其中x是第一個參數。

因此,您的比較應該是return x - y;或者排序算法永遠不會以正確的結果終止(儘管它會檢測到太多的迭代並拋出異常,抱怨比較被破壞)。

+0

好趕上,我更新了我提出的問題。然而,我沒有得到錯誤抱怨我的比較被打破,甚至在固定之後,我仍然得到相同的JIT錯誤。所以它似乎甚至沒有看到我的比較之前拋出的錯誤。 – MichaelTaylor3D 2013-05-10 19:02:14

+0

對不起,我沒有提到它最有可能不會解決JIT錯誤。 – 2013-05-10 19:45:57