【问题标题】:Parallel search in 2 collection2个集合中的并行搜索
【发布时间】:2021-02-26 05:25:40
【问题描述】:

所以,我有 2 个集合(第一个 - 所有符号,第二个 - 搜索)

IEnumerable<MarketSymbol> metadata; // 1
string [] symbols;                  // 2

例如, class MarketSymbol { string MarketSymbol {get;set;} }

我想通过属性MarketSymbol{get;set;}metadata 中找到所有相同的symbols

但我只需要找到所有穿过metadata 的符号 1 次。

结果必须是

返回MarketSymbol[] || IEnumerable&lt;MarketSymbol&gt; ... || add result to List&lt;MarketSymbol&gt; ...

建议:使用 PLINQ

【问题讨论】:

    标签: c# .net linq plinq


    【解决方案1】:
    1. 将符号数组放入 HashSet 中
    2. 创建一个包含结果的新结果集合
    3. 开始遍历元数据集合,如果当前项包含在HashSet中,则将其添加到结果集合中。

    这样你只会遍历元数据一次。

    【讨论】:

      【解决方案2】:

      已编辑添加了秒表,因此您可以根据列表大小查看是否真的值得使用并行。

      IEnumerable<MarketSymbol> metadata = new List<MarketSymbol> {
                              new MarketSymbol{  _MarketSymbol = "test3"  },
                              new MarketSymbol{ _MarketSymbol = "test2" }
                          };
                  string[] symbols = new string[] { "test", "test2", "test3" };
                  Stopwatch stopwatch = new Stopwatch();
      
                  stopwatch.Start();
                  var list = metadata.Where(x => symbols.Contains(x._MarketSymbol)).AsEnumerable().ToList();
                  stopwatch.Stop();
                  Console.WriteLine(stopwatch.Elapsed);
      
                  stopwatch.Start();
                  var list2 = symbols.Intersect(metadata.Select(x => x._MarketSymbol)).ToList();
                  stopwatch.Stop();
                  Console.WriteLine(stopwatch.Elapsed);
      
                  stopwatch.Start();
                  var list3 = symbols.AsParallel().Intersect(metadata.Select(x => x._MarketSymbol).AsParallel()).ToList();
                  stopwatch.Stop();
                  Console.WriteLine(stopwatch.Elapsed);
                  Console.ReadKey();
      

      结果列表,list2和list3:test3,test2

      【讨论】:

      • 您好,感谢您的帮助 :) 也许,您知道如何决定使用并行 PLINQ 方法吗?
      • List3 我想这就是你要找的。​​span>
      猜你喜欢
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 2018-02-24
      • 2023-04-03
      • 2014-07-31
      • 2011-04-04
      • 1970-01-01
      • 2017-07-21
      相关资源
      最近更新 更多