An alternative to using a `StringBuilder` is using LINQ with `string.Join()`. It's about as fast and is more concise and readable. public string BinarySearchSetup(long[] data, long[] searchTerms) { var resultString = ""; var lowerBound = 0; var upperBound = data.Length - 1; var results = searchTerms.Select(x => BinarySearch(data, lowerBound, upperBound, x)); return string.Join(" ", results); } If you want to parallelize the operation, you can just call `AsParallel()` and then `AsOrdered()` to preserve order: var results = searchTerms .AsParallel() .AsOrdered() .Select(x => BinarySearch(data, lowerBound, upperBound, x)); If you want to cache the results, you can build a dictionary on the distinct elements in a similar fashion to the above LINQ query. `AsOrdered()` is not required because it's getting stored in a dictionary. The method will look like this: public string BinarySearchSetup(long[] data, long[] searchTerms) { var lowerBound = 0; var upperBound = data.Length - 1; var cache = searchTerms .Distinct() .AsParallel() .ToDictionary(x => x, x => BinarySearch(data, lowerBound, upperBound, x)); var results = searchTerms.Select(x => cache[x]); return string.Join(" ", results); } Edit: Regarding `BinarySearch()`, when I make recursive methods, I like to make a top level method with less parameters that calculates the extra parameters to pass into the recursive method. Like this: public int BinarySearch(long[] data, long key) { var lowerBound = 0; var upperBound = data.Length - 1; return BinarySearch(data, lowerBound, upperBound, key); } If you don't mind working with ints (which I think arrays are indexed with anyway), you can use [Array.BinarySearch()][1]. According to the documentation, a negative number is returned with an element is not found, and it's not necessarily -1, so we will have to handle that. public long BinarySearch(long[] data, long key) { var lowerBound = 0; var upperBound = data.Length - 1; int result = Array.BinarySearch(data, key); return Math.Max(result, -1); } [1]: https://msdn.microsoft.com/en-us/library/2cy9f6wb(v=vs.110).aspx