.NET Framework
Коллекции
Поиск…
замечания
Существует несколько видов коллекций:
-
Array
-
List
-
Queue
-
SortedList
-
Stack
- толковый словарь
Создание инициализированного списка с использованием пользовательских типов
public class Model
{
public string Name { get; set; }
public bool? Selected { get; set; }
}
Здесь у нас есть класс без конструктора с двумя свойствами: Name
и nullable boolean property Selected
. Если мы хотим инициализировать List<Model>
, для его выполнения существует несколько разных способов.
var SelectedEmployees = new List<Model>
{
new Model() {Name = "Item1", Selected = true},
new Model() {Name = "Item2", Selected = false},
new Model() {Name = "Item3", Selected = false},
new Model() {Name = "Item4"}
};
Здесь мы создаем несколько new
экземпляров нашего класса Model
и инициализируем их данными. Что делать, если мы добавили конструктор?
public class Model
{
public Model(string name, bool? selected = false)
{
Name = name;
selected = Selected;
}
public string Name { get; set; }
public bool? Selected { get; set; }
}
Это позволяет нам немного инициализировать наш список.
var SelectedEmployees = new List<Model>
{
new Model("Mark", true),
new Model("Alexis"),
new Model("")
};
Что относительно класса, в котором одним из свойств является сам класс?
public class Model
{
public string Name { get; set; }
public bool? Selected { get; set; }
}
public class ExtendedModel : Model
{
public ExtendedModel()
{
BaseModel = new Model();
}
public Model BaseModel { get; set; }
public DateTime BirthDate { get; set; }
}
Обратите внимание, что мы вернули конструктор класса Model
чтобы немного упростить пример.
var SelectedWithBirthDate = new List<ExtendedModel>
{
new ExtendedModel()
{
BaseModel = new Model { Name = "Mark", Selected = true},
BirthDate = new DateTime(2015, 11, 23)
},
new ExtendedModel()
{
BaseModel = new Model { Name = "Random"},
BirthDate = new DateTime(2015, 11, 23)
}
};
Обратите внимание, что мы можем поменять наш List<ExtendedModel>
с помощью Collection<ExtendedModel>
, ExtendedModel[]
, object[]
или даже просто []
.
Очередь
В .Net используется коллекция для управления значениями в Queue
, использующей концепцию FIFO (first-in first-out) . Enqueue(T item)
очередей является метод Enqueue(T item)
который используется для добавления элементов в очередь и Dequeue()
который используется для получения первого элемента и удаления его из очереди. Общая версия может использоваться как следующий код для очереди строк.
Сначала добавьте пространство имен:
using System.Collections.Generic;
и использовать его:
Queue<string> queue = new Queue<string>();
queue.Enqueue("John");
queue.Enqueue("Paul");
queue.Enqueue("George");
queue.Enqueue("Ringo");
string dequeueValue;
dequeueValue = queue.Dequeue(); // return John
dequeueValue = queue.Dequeue(); // return Paul
dequeueValue = queue.Dequeue(); // return George
dequeueValue = queue.Dequeue(); // return Ringo
Существует не общий вариант типа, который работает с объектами.
Пространство имен:
using System.Collections;
Добавьте образец кода для не общей очереди:
Queue queue = new Queue();
queue.Enqueue("Hello World"); // string
queue.Enqueue(5); // int
queue.Enqueue(1d); // double
queue.Enqueue(true); // bool
queue.Enqueue(new Product()); // Product object
object dequeueValue;
dequeueValue = queue.Dequeue(); // return Hello World (string)
dequeueValue = queue.Dequeue(); // return 5 (int)
dequeueValue = queue.Dequeue(); // return 1d (double)
dequeueValue = queue.Dequeue(); // return true (bool)
dequeueValue = queue.Dequeue(); // return Product (Product type)
Существует также метод Peek (), который возвращает объект в начале очереди, не удаляя его.
Queue<int> queue = new Queue<int>();
queue.Enqueue(10);
queue.Enqueue(20);
queue.Enqueue(30);
queue.Enqueue(40);
queue.Enqueue(50);
foreach (int element in queue)
{
Console.WriteLine(i);
}
Выход (без снятия):
10
20
30
40
50
стек
Существует коллекция в .Net, используемая для управления значениями в Stack
, использующем концепцию LIFO (last-in first-out) . Основами стеков является метод Push(T item)
который используется для добавления элементов в стек и Pop()
который используется для добавления последнего элемента и удаления его из стека. Общая версия может использоваться как следующий код для очереди строк.
Сначала добавьте пространство имен:
using System.Collections.Generic;
и использовать его:
Stack<string> stack = new Stack<string>();
stack.Push("John");
stack.Push("Paul");
stack.Push("George");
stack.Push("Ringo");
string value;
value = stack.Pop(); // return Ringo
value = stack.Pop(); // return George
value = stack.Pop(); // return Paul
value = stack.Pop(); // return John
Существует не общий вариант типа, который работает с объектами.
Пространство имен:
using System.Collections;
И образец кода не общего набора:
Stack stack = new Stack();
stack.Push("Hello World"); // string
stack.Push(5); // int
stack.Push(1d); // double
stack.Push(true); // bool
stack.Push(new Product()); // Product object
object value;
value = stack.Pop(); // return Product (Product type)
value = stack.Pop(); // return true (bool)
value = stack.Pop(); // return 1d (double)
value = stack.Pop(); // return 5 (int)
value = stack.Pop(); // return Hello World (string)
Существует также метод Peek (), который возвращает последний добавленный элемент, но не удаляет его из Stack
.
Stack<int> stack = new Stack<int>();
stack.Push(10);
stack.Push(20);
var lastValueAdded = stack.Peek(); // 20
Можно выполнить итерацию по элементам в стеке, и он будет соблюдать порядок стека (LIFO).
Stack<int> stack = new Stack<int>();
stack.Push(10);
stack.Push(20);
stack.Push(30);
stack.Push(40);
stack.Push(50);
foreach (int element in stack)
{
Console.WriteLine(element);
}
Выход (без снятия):
50
40
30
20
10
Использование инициализаторов коллекции
Некоторые типы коллекций могут быть инициализированы во время объявления. Например, следующий оператор создает и инициализирует numbers
с целыми числами:
List<int> numbers = new List<int>(){10, 9, 8, 7, 7, 6, 5, 10, 4, 3, 2, 1};
Внутренне компилятор C # фактически преобразует эту инициализацию в серию вызовов метода Add. Следовательно, вы можете использовать этот синтаксис только для коллекций, которые фактически поддерживают метод Add
.
Классы
Stack<T>
иQueue<T>
не поддерживают его.
Для сложных наборов, таких как класс Dictionary<TKey, TValue>
, которые принимают пары ключ / значение, вы можете указать каждую пару ключ / значение как анонимный тип в списке инициализаторов.
Dictionary<int, string> employee = new Dictionary<int, string>()
{{44, "John"}, {45, "Bob"}, {47, "James"}, {48, "Franklin"}};
Первый элемент в каждой паре - это ключ, а второй - значение.