2012-09-21 6 views
1

사용하여 중첩 루프 목록 : 더 컴팩트하고 이해로 번역, this answer를 사용하여,프로세스 나는이 같은 루프했다 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.results = this.dataHelper.GetActiveIds() 
      .AsParallel() 
      .Select(id => new Tuple<int, IEnumerable<Thing>>(
       id, 
       this.dataHelper.GetThing(id, this.PossibleLastRunTime, utcNow))) 
      .ToList(); 

지금 나는이 더 복잡한 중첩 된 루프는 다음과 같습니다.

나는 비슷한 것을하고 싶지만, 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

목록을 단일 목록으로 병합하려면 Select() 대신 SelectMany()를 사용하십시오.

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