2014-10-06 5 views
1

Я пытаюсь сортировать iCollection объектов iBeacon, но как только код запускается, он генерирует исключение. Код, который я пытаюсь запустить, выглядит следующим образом. Он отлично работает без каких-либо заказа или сортировки, но мне нужно, чтобы иметь возможность сортировать коллекцию по близости, как показано на рисунке (с самой низкой близости первой т.е. близости равен 1):Xamarin Android - сортировка iBeacon iCollection вызывает исключение

async void RangingBeaconsInRegion(object sender, RangeEventArgs e) 
    { 

    if (e.Beacons.Count > 0) 
     { 
     var orderedBeacons = e.Beacons.OrderBy(b => b.Proximity); //this causes the problem 

     foreach (var beacon1 in orderedBeacons) 
     { 
      //do all my stuff here on my ordered beacons 
     } 
    } 
} 

Вот исключение:

[mono] Unhandled Exception: 
[mono] System.ArgumentException: 'jmethod' must not be IntPtr.Zero. 
[mono] Parameter name: jmethod 
[mono] at Android.Runtime.JNIEnv.CallObjectMethod (IntPtr jobject, IntPtr jmethod) [0x00000] in <filename unknown>:0 
[mono] at Android.Runtime.JavaCollection`1[RadiusNetworks.IBeaconAndroid.IBeacon].CopyTo (RadiusNetworks.IBeaconAndroid.IBeacon[] array, Int32 array_index) [0x00000] in <filename unknown>:0 
[mono] at System.Linq.Enumerable.ToArray[IBeacon] (IEnumerable`1 source) [0x00000] in <filename unknown>:0 
[mono] at System.Linq.QuickSort`1[RadiusNetworks.IBeaconAndroid.IBeacon]..ctor (IEnumerable`1 source, System.Linq.SortContext`1 context) [0x00000] in <filename unknown>:0 
[mono] at System.Linq.QuickSort`1+<Sort>c__Iterator0[RadiusNetworks.IBeaconAndroid.IBeacon].MoveNext() [0x00000] in <filename unknown>:0 

Любые идеи, как я могу получить коллекцию, заказанную правильно, пожалуйста?

+0

Я вижу ту же проблему в библиотеке AltBeacon. Я думаю, что это связано с переносом типа с JavaCollection на .NET ICollection, но я все еще смотрю. – chrisriesgo

+0

Я получаю то же самое. Очень странно. Я думаю, что ошибка Xamarin или состояние гонки в библиотеке AltBeacon. – Oenotria

ответ

1

Это должно сработать для вас. Дайте мне знать, как это происходит.

var allBeacons = new List<Beacon>(); 

foreach(var b in e.Beacons) 
{ 
    allBeacons.Add(b); 
} 

var orderedBeacons = allBeacons.OrderBy(b => b.Proximity); 
+0

Спасибо Крису. Хороший материал, отлично! –