public void SearchDir(string path) { var search = new ByteSearch(path, LoadResults()?.Select(x => x.File)); var charGen = new CharacterGenerator(); var models = charGen.GetCharacterModels(true); models.AddRange(charGen.GetCharacterModels(false)); var modelPatterns = models.Select(x => (x, x.Id.ToBytes())).ToList(); var processed = new BlockingCollection <ByteSearchResult <CharacterModel> >(); TrackProgress(processed); search.Search(modelPatterns, result => { foreach (var item in result.Results) { Console.WriteLine($"{item.Key} -> {result.File}"); } processed.Add(result); }); processed.CompleteAdding(); var results = LoadResults().Where(x => x.Found); var refs = new Dictionary <Model, HashSet <string> >(); foreach (var result in results) { foreach (var entry in result.Results) { if (!refs.TryGetValue(entry.Key, out var files)) { files = new HashSet <string>(); refs.Add(entry.Key, files); } var fileName = result.File.Substring(path.Length + 1).Replace("\\", "/"); if (fileName.EndsWith(".core")) { fileName = fileName.Substring(0, fileName.Length - 5); } files.Add(fileName); } } var references = refs.Select(x => new CharacterReference() { Source = x.Key.Source, Name = x.Key.Name, Files = x.Value.ToArray() }); var json = JsonConvert.SerializeObject(references, Formatting.Indented); File.WriteAllText(ReferencesFile, json); }