2012-09-21 3 views
1

У меня был цикл вроде этого:Процесс список с вложенным циклом с использованием PLINQ

 this.results = new List<Tuple<int, IEnumerable<Thing>>>(); 

     var utcNow = DateTime.UtcNow; 
     var resultsLocker = new object(); 

     Parallel.ForEach(
      this.dataHelper.GetActiveIds(), 
      id => 
      { 
       var result = new Tuple<int, IEnumerable<Thing>>(
        id, 
        this.dataHelper.GetThing(id, this.PossibleLastRunTime, utcNow)); 

       lock (resultsLocker) 
       { 
        this.results.Add(result); 
       } 
      }); 

и, используя this answer, переведены на более компактный и понятный:

 this.results = this.dataHelper.GetActiveIds() 
      .AsParallel() 
      .Select(id => new Tuple<int, IEnumerable<Thing>>(
       id, 
       this.dataHelper.GetThing(id, this.PossibleLastRunTime, utcNow))) 
      .ToList(); 

Теперь у меня есть более сложная вложенная петля как таковая:

 var measuresLocker = new object(); 
     var measures = new List<Tuple<int, object, object>>(); 

     Parallel.ForEach(
      this.results, 
      result => 
      { 
       foreach (var measuredValue in result.Item2.Select(destination => 
        new Tuple<int, object, object>(
         result.Item1, 
         destination.Message, 
         destination.DestinationName))) 
       { 
        lock (measuresLocker) 
        { 
         measures.Add(measuredValue); 
        } 
       } 
      }); 

Я хочу сделать что-то подобное, но я становлюсь остроумием h этот код:

 measures = this.results 
      .AsParallel() 
      .Select(result => result.Item2.Select(destination => 
       new Tuple<int, object, object>(
        result.Item1, 
        destination.Message, 
        destination.DestinationName)).ToList()).ToList(); 

Я, кажется, получаю список списков, и мне просто нужен один список в соответствии с моим исходным кодом. Можно ли это сделать довольно лаконично с помощью LINQ? И если да, то как?

ответ

3

Чтобы сгладить список списков в один список, используйте SelectMany() вместо Select().

measures = this.results 
     .AsParallel() 
     .SelectMany(result => result.Item2.Select(destination => 
      new Tuple<int, object, object>(
       result.Item1, 
       destination.Message, 
       destination.DestinationName)).ToList()).ToList(); 
Смежные вопросы