private static void AddLine(WordsListFactory wordsListFactory, KeyValuePair<long, List<string>> line) { foreach (var word in line.Value) { var firstChar = word[0]; var wordsList = wordsListFactory.GetOrCreateWordsList(firstChar); if (wordsList.WordsCollection.Any(w => w.Key == word)) { wordsList.WordsCollection.First(m => m.Key == word).Value.Add(line.Key); } else { wordsList.WordsCollection.Add(new KeyValuePair<string, List<long>>(word, new List<long>((int) line.Key))); } } }
static int Main(string[] args) { if (args.Length == 0) { Console.WriteLine("You must specify file to read from"); return 1; } string fileToRead = args[0]; if (!File.Exists(fileToRead)) { Console.WriteLine("File You specified doesn't exist"); return 2; } var wordsListFactory = new WordsListFactory(); Console.WriteLine("Start processing file"); Parallel.ForEach(File.ReadLines(fileToRead), (line, _, lineNumber) => { if (!string.IsNullOrEmpty(line)) { var lineWords = new KeyValuePair<long, List<string>>(lineNumber + 1, new List<string>()); Regex.Split(line, "[^A-Za-z0-9]") .Where(s => !string.IsNullOrWhiteSpace(s)) .ToList() .ForEach(w => lineWords.Value.Add(w.ToLower())); AddLine(wordsListFactory, lineWords); } }); var pathToWrite = args.Length > 1 ? args[1] : string.Format(@"{0}\{1}", Directory.GetCurrentDirectory(), "Result.txt"); var resultFile = new StreamWriter(pathToWrite, true); Parallel.ForEach(wordsListFactory.WordsLists, list => list.WordsCollection.OrderBy(w => w)); foreach (var wordsList in wordsListFactory.WordsLists.OrderBy(x => x.FirstChar)) { foreach (var word in wordsList.WordsCollection) { resultFile.WriteLine(string.Format("{0} - [{1}]", word.Key, string.Join(",", word.Value))); } } resultFile.Close(); return 0; }