Как превратить эти циклы C # foreach в LINQ to Objects и вернуть bool? - PullRequest
1 голос
/ 18 августа 2011

Я пишу скрипт .Net 3.5 C # для Sony Vegas Pro. Я создал этот метод, который возвращает true, если он находит видео-событие с тем же временным кодом, что и данное аудио-событие.

Это работает, но мне интересно, смогу ли я избавиться от циклов foreach с помощью LINQ. Я только изучаю LINQ, и я нахожу это довольно трудным, поэтому, если бы вы могли объяснить свои мыслительные шаги в поиске решения, это было бы здорово.

private bool videoExistsWithSameStart(TrackEvent currentEvent)
    {
        //Look through each video track - we don't want audio tracks.
        var videoTracks = from t in myVegas.Project.Tracks
                          where t.IsVideo()
                          select t;

        foreach (Track t in videoTracks)
        {
            foreach (TrackEvent te in t.Events)
            {
                if (te.Start == currentEvent.Start)
                    return true;
            }
        }
        return false;
    }

Ответы [ 5 ]

3 голосов
/ 18 августа 2011

Другая альтернатива:

return myVegas.Project.Tracks
    .Where(track => track.IsVideo())
    .SelectMany(track => track.Events)
    .Any(trackEvent => trackEvent.Start == currentEvent.Start);
1 голос
/ 18 августа 2011
return videoTracks.Any(track => 
  track.Events.Any(pumpkin => 
    pumpkin.Start == currentEvent.Start));
0 голосов
/ 18 августа 2011

В основном, то, что проще всего сделать (по крайней мере для меня), это попытаться объяснить, что вы пытаетесь сделать:

return videoTracks.Any(track => track.Events.Any(event => event.Start == currentEvent.Start));

То, что мы хотим знать: videoTracks имеет Любые дорожки, где Любые его событий сравниваются с текущим.

0 голосов
/ 18 августа 2011
return videoTracks.Any(t => t.Events.Any(te => te.Start == currentEvent.Start));
0 голосов
/ 18 августа 2011

Простите, у меня сейчас нет доступа к Visual Studio, но вы хотите попробовать?

return myVegas.Projects.Tracks.Any(t => t.IsVideo() && t.Events.Any(e => e.Start == currentEvent.Start));
...