i'm wondering is there any way to optimize this code? It must be able to work with big files, for example, formatting raw 140kb .txt file (12.5k words) takes 2 seconds (measured with Stopwatch class). Text example http://pastebin.com/2p88v8EN Maybe i used here some bad techniques or there is some part to simplify? Maybe multithreading? I'm not familiar with this yet. Would be grateful for help!
Code below:
class TextManipulations
{
public string[] wordsDist; // main array, contains words in alphabetic order and output lines
public void TextFormat(string sourcePath) // creating method that will format our source text according to task
{
string textInput = System.IO.File.ReadAllText(sourcePath).ToLower(); // reading text from file, lowercased at start for precise search
MatchCollection m = Regex.Matches(textInput, @"\b[\w']+\b"); // exact search of all alphanumeric "words" including words with apostrophe
List<string> words = new List<string>(); // creating List<T> for containing unknown amount of words
foreach (Match match in m) // assigning all matches to List<string>
{
words.Add(match.ToString());
}
words.Sort(); // sorting words in alphabetic order
wordsDist = words.Distinct().ToArray(); // assigning words to main array without duplicates
System.IO.File.WriteAllLines(@"D:\output.txt", wordsDist); // writing words into txt file to edit in setLineNumbers method
}
public void setLineNumbers(string sourcePath) // creating method for adding line numbers
{
string[] linesOutput = new string[wordsDist.Count()]; // creating array that will contain line numbers
string[] lines = System.IO.File.ReadAllLines(sourcePath); // assigning source text by lines
for (int j = 0; j < wordsDist.Count(); j++) // main cycle checking each word for presence in each line
{
for (int i = 0; i < lines.Count(); i++)
{
if (Regex.IsMatch(lines[i].ToLower(), "\\b" + wordsDist[j] + "\\b")) // using ToLower() here, because we can't use it in line 33
{
linesOutput[j] += (i + 1).ToString() + ", "; // adding line numbers according to word
}
}
}
for (int i = 0; i < wordsDist.Count(); i++) // connection of two relative arrays
{
wordsDist[i] += "_______________________________" + linesOutput[i];
wordsDist[i] = wordsDist[i].Remove(wordsDist[i].Length - 2); // removing last ',' char
}
System.IO.File.WriteAllLines(@"D:\output.txt", wordsDist); // writing final output result into txt file
}
}