2016-07-16 9 views
1

У меня есть kinect SDK для разработки приложения на C#. Теперь я сомневаюсь в отслеживании скелета.Оба метода отслеживания скелета верны в kinect?

У меня есть 2 кода, но есть 2 разных подхода. Я хочу знать, что оба метода приводят к тем же концепциям? или разные?

код 1:

void Kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) 
{ 
    using (SkeletonFrame frame = e.OpenSkeletonFrame()) 
    { 
     m_skeletons = new Skeleton[frame.SkeletonArrayLength]; 
     frame.CopySkeletonDataTo(m_skeletons); 
    } 

    if(m_skeletons != null && m_skeletons.Length != 0) 
    { 
     foreach (Skeleton skeleton in m_skeletons) 
     { 
      if (skeleton != null && skeleton.TrackingState == SkeletonTrackingState.Tracked) 
      { 
       //doing some operations 
      } 


      } 

     } 

} 

Теперь еще методы отслеживания, такие как: код 2:

void Kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) 
{ 
    using (SkeletonFrame frame = e.OpenSkeletonFrame()) 
    { 
     m_skeletons = new Skeleton[frame.SkeletonArrayLength]; 
     frame.CopySkeletonDataTo(m_skeletons); 
    } 

    if(m_skeletons != null && m_skeletons.Length != 0) 
    { 
     foreach (Skeleton skeleton in m_skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked)) 
      { 

       //doing some operations 
      } 

     } 

} 

является одновременно foreach (Skeleton skeleton in m_skeletons) и

foreach (Skeleton skeleton in m_skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked)) 

правильно? Есть ли разница?

ответ

1

Оба подхода функционально эквивалентны.

.Where(s => s.TrackingState == SkeletonTrackingState.Tracked) создает счетчик, который уже включает чек. Таким образом, ваш foreach будет выполнять только итерацию элементов, для которых выполняется условие. В другом примере вы делаете это явно с помощью инструкции if.