using System; // Huom! C#:n ja Javan säiliöluokat ovat lähes identtiset nimiä myöten! using System.Collections; namespace stream { /// /// lukee dataa |-erotetusta syötteestä, esimerkki säiliöiden käytöstä /// /// Miika Nurminen, 16.9.2004 public class Lukija : Filter { // ArrayList, joka sisältää string-taulukoita (string[]) private ArrayList content = new ArrayList(); private ContentComparer comparer; public Lukija(int fieldNum) { comparer = new ContentComparer(fieldNum); } public string processLine(string s) { /* C#:ssä ei ole StringTokenizer-luokkaa, mutta split-metodi ajaa saman asian */ char[] separators = {'|'}; string[] values = s.Split(separators); content.Add(values); return null; } public string getResult() { sort(); return ToString(); } /// /// Vertailijaluokka. Huom. C#:ssä sisäluokat eivät pääse /// automaattisesti ulkoisen luokan tietoihin, kuten Javassa. /// public class ContentComparer : IComparer { private int field; public ContentComparer(int num) { fieldNum = num; } public int Compare( Object x, Object y ) { string[] a = (string[])x; string[] b = (string[])y; return a[fieldNum].CompareTo(b[fieldNum]); } // Esimerkki propertysta public int fieldNum { get { return field; } set { field = value; } } } private void sort() { content.Sort(comparer); } /// /// järjestää taulukon n:nnen kentän mukaan. huom. ei turvallinen /// (ei rajatarkastuksia) - lisäksi tietoja luettaessa kenttien /// määrä voi vaihdella. /// public void sortByField(int i) { comparer.fieldNum = i; sort(); } /// /// summaa n:nnen kentän. huom, oletuksena on, että kenttä /// sisältää numerotietoa. ei rajatarkistuksia! /// public int sumByField(int i) { int result = 0; foreach (String[] s in content) { try { result += Convert.ToInt32(s[i]); } catch (Exception e) { Console.Error.WriteLine(e.Message); } } return result; } /// /// Syrjäytetään yläluokan ToString /// /// /// Taulukon merkkijonoesitys /// public override string ToString() { // StringBuilder == Javan StringBuffer System.Text.StringBuilder sb = new System.Text.StringBuilder(); foreach (String[] s in content) { for (int i=0; i0) sb.Append('|'); sb.Append(s[i]); } sb.Append('\n'); } return sb.ToString(); } } }