public void train(int topN) { _topN = topN; _randomRecommends = ArrayView<string>.Create(primeNumber * topN); var isbns = trainData.Select(e => e.ISBN).Distinct().ToArray(); Parallel.ForEach(Enumerable.Range(0, primeNumber), new ParallelOptions { MaxDegreeOfParallelism = 4 }, seed => { var rand = new Random(seed); var visited = new HashSet<int>(); var view = _randomRecommends.SubArray(seed* topN, _topN); var viewIndex = 0; while (viewIndex < topN) { var isbnIndex = rand.Next(isbns.Length); if (!visited.Add(isbnIndex)) continue; view[viewIndex++] = isbns[isbnIndex]; } }); }