1

次のようなループがありました。

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

今、私はより複雑なネストされたループを持っています:

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

私は似たようなことをしたいのですが、このコードに行き詰まっています:

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

リストのリストを取得しているようで、元のコードに従って1つのリストが必要です。これは、LINQ を使用してかなり簡潔に行うことができますか? もしそうなら、どのように?

4

1 に答える 1

3

リストのリストを 1 つのリストにフラット化するには、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();
于 2012-09-21T14:31:46.490 に答える