using System.Collections.Generic;
using System.Diagnostics;
public static void Main()
var lines_list = new List<string>();
var wordsArr = new string[]{"alpha", "beta", "gama", "delta", "Epsilon", "Zeta", "Eta", "Theta", "Iota", "kaPPa", "LamBda", "mU", "Nu", "xi", "omicron", "pi", "rHo", "siGma", "Tau", "UpSiLoN", "pHi", "chi", "psi", "omega"};
var ss = new StringBuilder();
var rnd = new Random( 12345 );
for ( int i = 0; i < 50000; i++ )
var words_arr = new List<string>();
for ( int j = 0; j < rnd.Next(10,20); j++)
words_arr.Add( wordsArr[ rnd.Next( wordsArr.Length ) ] );
var tab_count = rnd.Next( 0, 5 );
var line = new StringBuilder();
for ( int k = 0; k < tab_count; k++ ) line.Append("\t");
foreach( var w in words_arr )
var result = line + "\n";
lines_list.Add( result );
var sw = new System.Diagnostics.Stopwatch();
var tp = new TextProcessor();
tp.ProcessFile( lines_list.ToArray(), new string[]{ "alpha", "beta", "gama", "delta", "epsilon", "zeta", "eta", "theta", "iota", "kappa", "lambda", "mu", "nu", "xi", "omicron", "pi", "rho", "sigma", "tau", "upsilon", "phi", "chi", "psi", "omega"});
Console.WriteLine( "--> Time: " + sw.ElapsedMilliseconds + " ms. ") ;
public List<string> lines;
public List<int> indexes;
lines = new List<string>(){};
indexes = new List<int>();
public Line( string line, int index )
lines = new List<string>(){ line };
indexes = new List<int>(){ index };
public void AddLine( string line, int index )
public class TextProcessor
public Dictionary<string, Line> data;
public void ProcessFile(string[] lines, string[] words)
data = new Dictionary<string, Line>();
var spaces = new char[]{' ',' ','\r','\n'};
foreach(string line in lines)
for ( int i = 0; i < line.Length; i++ )
if ( !char.IsWhiteSpace(line[i]) )
for ( int i = f1; i < line.Length; i++ )
if ( char.IsWhiteSpace(line[i]) )
word = line.Substring( f1, f2 - f1 ).ToLower();
if (data.ContainsKey(word))
data[word].AddLine( line, line_index );
data[word] = new Line( line, line_index );
keys = new string[data.Keys.Count];
data.Keys.CopyTo(keys, 0);
this.lines = new Line[data.Values.Count];
data.Values.CopyTo(this.lines, 0);