【问题标题】:Process a list with a nested loop using PLINQ使用 PLINQ 处理具有嵌套循环的列表
【发布时间】:2012-09-21 14:28:17
【问题描述】:

我有一个这样的循环:

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

我想做类似的事情,但我被这段代码卡住了:

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

我似乎得到了一个列表列表,我只是想要一个按照我的原始代码的列表。这可以使用 LINQ 非常简洁地完成吗?如果有,怎么做?

【问题讨论】:

    标签: c# .net linq loops plinq


    【解决方案1】:

    要将列表列表扁平化为单个列表,请使用 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();
    

    【讨论】:

      猜你喜欢
      • 2022-11-07
      • 2018-01-06
      • 2011-04-07
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多