овп2 / ОВП2_коллекции2
.pdfВП2_Коллекции
Пример 2. Разработаем простейшую записную книжку, в которую можно добавлять и удалять телефоны, а также осуществлять поиск номера телефона по фамилии и фамилии по номеру телефона.
using System;
using System.Collections; using System.IO;
using System.Text;
namespace MyProgram
{
class Program
{
static void printTab(string s, Hashtable a)
{
Console.WriteLine(s);
ICollection key = a.Keys; //Прочитали все ключи
foreach (string i in key)//использование ключа для получения значения
{
Console.WriteLine(i + "\t" + a[i]);
}
}
static void Main(string[] args)
{
StreamReader fileIn = new StreamReader("t.txt",Encoding.GetEncoding(1251));
string line;
Hashtable people = new Hashtable();
while ((line = fileIn.ReadLine()) != null) //цикл для организации обработки
файла
{
string [] temp = line.Split(' '); people.Add(temp[0],temp[1]);
}
fileIn.Close();
printTab("Исходные данные: ", people);
Console.WriteLine("Введите номер телефона"); line = Console.ReadLine();
if (people.ContainsKey(line)) Console.WriteLine(line + "\t" + people[line]); else
{
Console.WriteLine("Такого номера нет в записной книжке.\nВведите фамилию: ");
21
ВП2_Коллекции
string line2=Console.ReadLine(); people.Add(line,line2);
}
printTab("Исходные данные: ", people);
Console.WriteLine("Введите фамилию для удаления"); line = Console.ReadLine();
if (people.ContainsValue(line))
{
ICollection key =people.Keys; //Прочитали все ключи Console.WriteLine(line);
string del="";
foreach (string i in key)//использование ключа для получения значения if (string.Compare((string)people[i], line) == 0)
{
del = i; break;
}
Console.WriteLine(del + "\t" + people[del] + "- данные удалены!!!");
people.Remove(del); printTab("Измененные данные: ", people);
}
else Console.WriteLine("Такого абонента в записной книжке нет ");
}
}
}
_________t.txt____________
12-34-56 Иванов
78-90-12 Петров
34-56-78 Семёнов
90-11-12 Пиманов
22
ВП2_Коллекции
Выбор подходящей коллекции в .NET.
От выбора структур хранения данных и алгоритмов в значительной степени зависит производительность. Поэтому знание стандартных коллекций дает возможность писать более быстрые и надежные программы.
Встроенные массивы или List?
Массивы в C# отлично подходят для хранения огромного числа элементов, но есть одна проблема, они являются неизменными в плане добавления или удаления элементов. Другими словами, если мы хотим уменьшить или увеличить число элементов в массиве, нам придется заново пересоздавать весь массив. Это занимает сравнительно много ресурсов.
List, напротив же, идеален для тех случаев, когда количество элементов в коллекции часто меняется.
Итог: если коллекция не меняется или меняется редко – выбираем встроенные массивы, в противном случае List.
List или ArrayList?
Класс List в C# появился на платформе .NET значительно позже, чем Hashtable. Эти две коллекции фактически являются одним и тем же – реализацией динамических массивов в C#. Но в отличие от ArrayList, список (list) является generic-типом, строго типизированным, а значит и более быстрым в тех случаях, когда тип данных нам известен заранее.
Dictionary или Hashtable?
Эти две коллекции служат для хранение элементов в формате ключ-значения. Здесь мы имеем точно такую же ситуацию как с List и ArrayList. Dictionary появился позже, он является generic типом, он более быстр в тех случаях, когда тип данных нам известен заранее.
List или Stack?
Стэк - необычная коллекция, она оптимизирована под работу по принципу LIFO (последний пришел, первый вышел). Конечно, с помощью List можно реализовать так же принцип, но он будет работать менее производительно, чем стэк.
23
ВП2_Коллекции
24