2011-09-22 5 views
1

MonoTouch에서 NSSet의 각 객체를 처리해야합니다. 상기 방법은 결과 세 객체 호출Enumerate는 MonoTouch에서 어떻게 작동합니까?

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 
} 

있지만, 하나의 오브젝트 만이 대표로 처리되어 다음과 같이 열거를 사용하여 내 시도가있다. 저는 위임자가 3 번 처형 될 것이라고 예상 했었지만 그것이 어떻게 작동하는지 잘못 이해해야합니다.

문서 또는 예제를 찾을 수 없습니다. 어떤 제안이라도 대단히 감사합니다.

답변

6

ref 매개 변수를 false로 설정해야합니다. 이 열거 계속 핸들러를 지시합니다

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

Here 애플의 문서에서 ObjC에 해당합니다.

+0

위대한 작품! 많은 감사합니다. – BillF

+0

도와 주셔서 감사합니다. 응답을 받아 들여 다른 StackOverflow 사용자가 답을 얻지 못하게하십시오. –

0

또는 당신은 그것을 쉽게하기 위해이 확장 방법을 시도해 볼 수도 있습니다 ..

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

참고 : 명심이 다른 목록과 사본 모두를 생성 덜 효율적입니다. 익명 메소드에서는 "yield return"을 사용할 수 없기 때문에이 작업을 수행 했으므로 사본이없는 실제 열거자를 만들 수있는 다른 방법은 훨씬 더 많은 코드였습니다. 제가 다루는 세트의 대부분은 작기 때문에 이것은 중요하지 않습니다. 그러나 여러분이 큰 세트를 가지고 있다면 이것은 이상적이지 않습니다.

관련 문제