Как Enumerate работает в MonoTouch? - PullRequest
       6

Как Enumerate работает в MonoTouch?

1 голос
/ 22 сентября 2011

В MonoTouch мне нужно обрабатывать каждый объект в NSSet. Моя попытка с использованием Enumerate выглядит следующим образом:

public override void ReturnResults ( BarcodePickerController picker, NSSet results )
{
    var n = results.Count;  // Debugging - value is 3
    results.Enumerate( delegate( NSObject obj, ref bool stop ) 
    {
        var foundCode = ( obj as BarcodeResult ); // Executed only once, not 3 times
        if ( foundCode != null )
        {
            controller.BarcodeScannedResult (foundCode);
        }
    });
// Etc
}

Хотя метод вызывается с тремя объектами в результатах, в делегате обрабатывается только один объект. Я ожидал, что делегат будет казнен трижды, но я должен иметь неверное представление о том, как он работает.

Невозможно найти какую-либо документацию или примеры. Любое предложение высоко ценится.

Ответы [ 2 ]

6 голосов
/ 22 сентября 2011

Вы должны установить для параметра ref значение false.Это указывает обработчику продолжить перечисление:

if ( foundCode != null )
{
    controller.BarcodeScannedResult (foundCode);
    stop = false; // inside the null check
}

Здесь - это эквивалент ObjC из документации Apple.

0 голосов
/ 30 августа 2012

Или вы можете попробовать этот метод расширения, чтобы упростить его.

public static class MyExtensions {
    public static IEnumerable<T> ItemsAs<T>(this NSSet set) where T : NSObject {
        List<T> res = new List<T>();
        set.Enumerate( delegate( NSObject obj, ref bool stop ) {
            T item = (T)( obj ); // Executed only once, not 3 times
            if ( item != null ) {
                res.Add (item);
                stop = false; // inside the null check
            }
         });

         return res;
    }
}   

Затем вы можете сделать что-то вроде:

foreach(BarcodeResult foundCode in results.ItemsAs<BarcodeResult>()) {
    controller.BarcodeScannedResult (foundCode);
}

Примечание: имейте в виду, что это создает другой списоки копирует в него все, что менее эффективно.Я сделал это, потому что «возвращение результата» недопустимо в анонимных методах, и альтернативные способы сделать его настоящим перечислителем без копии были намного большим количеством кода.Большинство наборов, с которыми я имею дело, крошечные, так что это не имеет значения, но если у вас большой набор, это не идеально.

...