Dictionary<TKey, TValue> это класс храняющий набор пар "ключ-значение".
Dictionary<TKey, TValue> относится к
типизированной коллекции... то есть все элементы одного типа.
C#
Создаем новое C# консольное приложение... и напишем код
using System;
using System.Collections.Generic; // подключаем Dictionary<TKey, TValue>
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// создаем Dictionary
Dictionary<string, string> dict = new Dictionary<string, string>();
// добавляем элементы
dict.Add("txt" /*ключ*/, "notepad.exe" /*значение*/);
dict.Add("bmp" /*ключ*/, "paint.exe" /*значение*/);
dict.Add("dib" /*ключ*/, "paint.exe" /*значение*/);
dict.Add("rtf" /*ключ*/, "wordpad.exe" /*значение*/);
// в dict элементы:
// {key="txt", value="notepad.exe"}
// {key="bmp", value="paint.exe"}
// {key="dib", value="paint.exe"}
// {key="rtf", value="wordpad.exe"}
// Вариант 1 (перебираем все элементы с помощью foreach и выводим на экран)
foreach (string key in dict.Keys) // перебираем все ключи
Console.WriteLine("Ключ=" + key + " , значение=" + dict[key]); // получаем значение
// на экране увидим "Ключ=txt , значение=notepad.exe"
// на экране увидим "Ключ=bmp , значение=paint.exe"
// на экране увидим "Ключ=dib , значение=paint.exe"
// на экране увидим "Ключ=rtf , значение=wordpad.exe"
// Dictionary не сотрирует значения по ключу
// Вариант 2 (перебираем все элементы с помощью foreach и выводим на экран)
foreach (KeyValuePair<string, string> item in dict)
Console.WriteLine("Ключ=" + item.Key + " , значение=" + item.Value);
// на экране увидим "Ключ=txt , значение=notepad.exe"
// на экране увидим "Ключ=bmp , значение=paint.exe"
// на экране увидим "Ключ=dib , значение=paint.exe"
// на экране увидим "Ключ=rtf , значение=wordpad.exe"
// Dictionary не сотрирует значения по ключу
// установить значение по ключу
dict["eee"] = "office.exe";
// в dict элементы:
// {key="txt", value="notepad.exe"}
// {key="bmp", value="paint.exe"}
// {key="dib", value="paint.exe"}
// {key="rtf", value="wordpad.exe"}
// {key="eee", value="office.exe"}
// Вариант 1. Получить значение по ключу (не будет exception если ключа не существует)
string value;
if (dict.TryGetValue("ooo", out value))
Console.WriteLine(value);
// Вариант 2. получить значение по ключу (будет EXCEPTION если ключа не существует)
try
{
value = dict["vvv"];
}
catch (KeyNotFoundException e)
{
Console.WriteLine(e.Message); // key not found
}
// узнать есть ли такой ключ (не будет exception если ключа не существует)
bool isFound = dict.ContainsKey("iii");
// isFound = false
// удаляем элемент по ключу "rtf" {key="rtf", value="wordpad.exe"}
dict.Remove("rtf");
// в dict элементы:
// {key="txt", value="notepad.exe"}
// {key="bmp", value="paint.exe"}
// {key="dib", value="paint.exe"}
// {key="eee", value="office.exe"}
}
}
}
C#
Создаем новое C# консольное приложение... и напишем код
using System;
using System.Collections.Generic; // подключаем Dictionary
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Book
{
public string BookName { set; get; }
public string AuthorName { set; get; }
}
class Program
{
static void Main(string[] args)
{
// создаем List
Dictionary<Book, int> books = new Dictionary<Book, int>();
// заполняем книги
books.Add(new Book() { BookName = "Властелин Колец", AuthorName = "Толкин" }, 300 /*price*/);
books.Add(new Book() { BookName = "Три мушкетера", AuthorName = "Дюма" }, 200 /*price*/);
// ищем книгу
Book findBook = new Book() { BookName = "Три мушкетера", AuthorName = "Дюма" };
int price = 0;
if (books.TryGetValue(findBook, out price))
{
Console.WriteLine("Найдено! Название:{0}, Автор:{1}, Цена:{2}", findBook.BookName, findBook.AuthorName, price);
}
else
{
Console.WriteLine("Не найдено");
}
// на экране увидим "Не найдено"
}
}
}
Решение
Чтобы искалось не по ссылке объекта а по содержимому нужно написать 2 метода для Book:
public override bool Equals(Object obj)
{
...
}
public override int GetHashCode()
{
...
}
C#
Решение. Полный код.
using System;
using System.Collections.Generic; // подключаем Dictionary
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Book
{
public string BookName { set; get; }
public string AuthorName { set; get; }
public override bool Equals(Object obj)
{
Book book = obj as Book;
return (BookName.CompareTo(book.BookName) == 0 && AuthorName.CompareTo(book.AuthorName) == 0);
}
public override int GetHashCode()
{
unchecked
{
return BookName.GetHashCode() + AuthorName.GetHashCode();
}
}
}
class Program
{
static void Main(string[] args)
{
// создаем List
Dictionary<Book, int> books = new Dictionary<Book, int>();
// заполняем книги
books.Add(new Book() { BookName = "Властелин Колец", AuthorName = "Толкин" }, 300 /*price*/);
books.Add(new Book() { BookName = "Три мушкетера", AuthorName = "Дюма" }, 200 /*price*/);
// ищем книгу
Book findBook = new Book() { BookName = "Три мушкетера", AuthorName = "Дюма" };
int price = 0;
if (books.TryGetValue(findBook, out price))
{
Console.WriteLine("Найдено! Название:{0}, Автор:{1}, Цена:{2}", findBook.BookName, findBook.AuthorName, price);
}
else
{
Console.WriteLine("Не найдено");
}
// на экране увидим "Найдено! Название:Три мушкетера, Автор:Дюма, Цена:200"
}
}
}