在 2 个集合中并行搜索
Parallel search in 2 collection
所以,我有 2 个集合(第一个 - 所有符号,第二个 - 搜索)
IEnumerable<MarketSymbol> metadata; // 1
string [] symbols; // 2
例如,
class MarketSymbol { string MarketSymbol {get;set;} }
我想在 metadata
中找到所有相同的 symbols
属性 MarketSymbol{get;set;}
。
但我只需要 1 次就可以找到遍历 metadata
的所有符号。
结果必须是
return MarketSymbol[]
|| IEnumerable<MarketSymbol> ...
|| add result to List<MarketSymbol> ...
建议:使用PLINQ
- 将符号数组放入 HashSet
- 创建一个包含结果的新结果集合
- 开始遍历元数据集合,如果当前项包含在HashSet中,则将其添加到结果集合中。
这样你将只遍历元数据一次。
已编辑 添加了秒表,以便您可以查看是否真的值得根据您的列表大小使用并行。
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
所以,我有 2 个集合(第一个 - 所有符号,第二个 - 搜索)
IEnumerable<MarketSymbol> metadata; // 1
string [] symbols; // 2
例如,
class MarketSymbol { string MarketSymbol {get;set;} }
我想在 metadata
中找到所有相同的 symbols
属性 MarketSymbol{get;set;}
。
但我只需要 1 次就可以找到遍历 metadata
的所有符号。
结果必须是
return MarketSymbol[]
|| IEnumerable<MarketSymbol> ...
|| add result to List<MarketSymbol> ...
建议:使用PLINQ
- 将符号数组放入 HashSet
- 创建一个包含结果的新结果集合
- 开始遍历元数据集合,如果当前项包含在HashSet中,则将其添加到结果集合中。
这样你将只遍历元数据一次。
已编辑 添加了秒表,以便您可以查看是否真的值得根据您的列表大小使用并行。
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