By Ramkumar Durgam
// ' PhoneDirIndex.cs - PhoneDirectory to simulate the use of an Multiparameter Indexer using C# // ----------------------------------------------------------------------------------------------------- // using System; namespace PhoneDirIndexer { class PhoneDir { private string[] _name; private uint[] _phoneNumber; private ushort _size; public PhoneDir(ushort size) // Default Constructor { _size = size; _name = new string[size]; _phoneNumber = new uint[size]; for (int i=0; i < size; i++) { _name[i] ="No Name"; _phoneNumber[i] = 0; } } // Indexer 1.0 - Read/Write Indexer (returns the Name and Phonenumber based on the Position and sets the Name) public string this[int pos] { get { Console.Write("Calling Get on Indexer 1.0..."); return (_name[pos] + "(" + _phoneNumber[pos] +")") ; } set { Console.WriteLine("Calling Set on Indexer 1.0..."); _name[pos] = value; } } // Indexer 2.0 - Read/Write Indexer (returns the Name and Phonenumber based on the Position and sets the Name) public string this[string name] { get { Console.Write("Calling Get on Indexer 2.0..."); int pos; pos = -1; for (int i=0;i < _size;i++) { if(_name[i] == name) { pos = i; break; } } if (pos >=0) return (_name[pos] + "(" + _phoneNumber[pos] +")") ; else return ""; } set { Console.WriteLine("Calling Set on Indexer 2.0..."); int pos; pos = -1; for (int i=0;i < _size;i++) { if(_name[i] == name) { pos = i; break; } } if (pos >=0) _phoneNumber[pos] = Convert.ToUInt16(value); } } // Indexer 3.0 - Read/Write Indexer to return the name for a given phone number and updates a phonenumber for a given phone number public string this[uint phone] { get // Returns the name for a given phone number { Console.Write("Calling Get on Indexer 3.0..."); int pos = -1; for (int i =0; i < _size; i++) { if (_phoneNumber[i] == phone) { pos = i; break; } } if (pos >=0 ) return ( _name[pos] ); else return ""; } set // Set (updates) the phone number(s) for a given Phone number { Console.WriteLine("Calling Set on Indexer 3.0..."); for (int i =0;i < _size; i++) { if (_phoneNumber[i] == phone) _phoneNumber[i] = Convert.ToUInt16(value); } } } // Indexer 4.0 - Readonly Indexer (returns the Position for a given Name and Phonenumber combination) public int this[string name,uint phone] { get { Console.Write("Calling ReadOnly Indexer 4.0..."); int pos = -1; for (int i=0; i < _size; i++) { if (_name[i] == name && _phoneNumber[i] == phone) { pos = i; break; } } return pos; } } } class PhoneDirUI { static void Main(string[] args) { int noOfListings = 5; PhoneDir listing = new PhoneDir(5) ; listing[1] = "John.A"; // OUTPUT: "Calling Set on Indexer 1.0..." listing[3] = "John.B"; // OUTPUT: "Calling Set on Indexer 1.0..." listing["John.A"] = "1111"; // OUTPUT: "Calling Set on Indexer 2.0..." listing[1111u] = "1234"; // OUTPUT: "Calling Set on Indexer 3.0..." // Note: 'u' (next to the number) is the only one that causes Indexer3.0 to be called // Without that Indexer 1.0 would have been called becuase it thinks its an integer and not a uint listing["John.B"] = "2222"; // OUTPUT: "Calling Set on Indexer 2.0..." for (int i=0;i < noOfListings; i++) { Console.WriteLine("listing[{0}] : {1}",i,listing[i]); // OUTPUT: "Calling Get on Indexer 1.0... listing[i] : _name(_phone) } Console.WriteLine("Person Located in Phone number 1111..." + listing[1111u]); //OUTPUT: Calling Get on Indexer 3.0 ... Person Located in Phone Number 1111... Console.WriteLine("Person Located in Phone number 1234..." + listing[1234u]); //OUTPUT: Calling Get on Indexer 3.0 ... Person Located in Phone Number 1234....John.A (because we updated the phone number above) Console.WriteLine("John.B,2222 is located in..." + listing["John.B",2222]); //OUTPUT: Calling ReadOnly Indexer 4.0 ... John.B,2222 is located in...3 Console.ReadLine(); } } } --------------------- Output -------------------- Calling Set on Indexer 1.0... Calling Set on Indexer 1.0... Calling Set on Indexer 2.0... Calling Set on Indexer 3.0... Calling Set on Indexer 2.0... Calling Get on Indexer 1.0...listing[0] : No Name(0) Calling Get on Indexer 1.0...listing[1] : John.A(1234) Calling Get on Indexer 1.0...listing[2] : No Name(0) Calling Get on Indexer 1.0...listing[3] : John.B(2222) Calling Get on Indexer 1.0...listing[4] : No Name(0) Calling Get on Indexer 3.0...Person Located in Phone number 1111... Calling Get on Indexer 3.0...Person Located in Phone number 1234...John.A Calling ReadOnly Indexer 4.0...John.B,2222 is located in...3