- Одномерные массивы, многомерные массивы, чередующиеся массивы (чередующиеся массивы)
Массив: содержит группу чисел одного типа данных.
Формат: имя массива datatype[]
-
-
-
-
- Одномерный массив:
-
-
-
Способ 1: int[] ages = new int[2]{1,2};//Объявляем и инициализируем одномерный массив, число в скобках — количество элементов в массиве. = возраст[0]
Способ 2: int[] ages; //объявляем одномерный массив
ages = new int[6];//Инициализировать одномерный массив
Способ 3: int[] ages = {1,3,4};//Прямое присваивание для создания одномерного массива из 3 элементов.
-
-
-
-
- Многомерные массивы (массивы с размерностью больше или равной 2):
-
-
-
Способ 1: int[] ages = new int[2,3]{{1,2,3},{4,5,6}};//Объявить и инициализировать двумерный массив (запятая)
Метод 2: int[] age ;
ages = new int[2,3];
Способ 3: int[] age = {{1,2,3},{4,5,6}};
Int[] трехмерный массив (две запятые), int[] четырехмерный массив (три запятые),. . . . .
-
-
-
-
- Чередующийся массив: массив внутри массива, элементами которого являются массивы.
-
-
-
Int[][] ages = new int[2][]{new int[2]{1,2},new int[3]{3,4,5}};
-
-
-
-
- Двумерный массив
-
-
-
int[,] myInt = new int[3, 3];
myInt[0, 0] = 1; myInt[0, 1] = 2; myInt[0, 2] = 3;
myInt[1, 0] = 4; myInt[1, 1] = 5; myInt[1, 2] = 6;
myInt[2, 0] = 7; myInt[2, 1] = 8; myInt[2, 2] = 9;
// эквивалентно int[] myInt = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, // 9 } };
for (int i = 0; i <= myInt.GetUpperBound(0); i++)
{
for (int j = 0; j <= myInt.GetUpperBound(1); j++)
{
Console.Write(myInt[i,j]+",");
}
Console.WriteLine();
}
-
-
-
-
- Массив в шахматном порядке: int [] [] myInt = new int [3] [];
-
-
-
myInt[0] = new int[3] { 1, 2, 3 };
myInt[1] = new int[5] { 4, 5, 6, 7 ,8}; myInt[2] = new int[2] { 5, 6 };
for (int i = 0; i <= myInt.GetUpperBound(0); i++)
{
for (int j = 0; j < myInt[i].Length; j++)
{
Console.Write(myInt[i][j]+",");
} Console.WriteLine();
}
Методы в массиве:
Array.Clear устанавливает элементы ряда в массиве равными нулю.
Array.Clear (массив массива, индекс int, длина int).
int[] a = { 3, 5, 7, 8, 9 };
Array.Clear(a, 1, 2);
foreach (int i in a)
{
Console.Write(i+",");
}
int[] a = { 3, 5, 7, 8, 9 };
int[] b = new int[15];
Array.Copy(a, 1, b, 1, 3);
foreach (int i in b)
{
Console.Write(i+",");
}//Результат вывода: 0,5,7,8,0,0,0,0,0,0,0,0,0,0,0,
Array.Indexof определяет, существует ли число, и выполняет поиск слева направо.
Array.LastIndexOf() ищет справа налево
int[] a = { 3, 5, 7, 8, 9 };
int w = Array.IndexOf(a, 2);
Console.WriteLine(w);//Результат -1.Возвращает нижний индекс, если он существует, возвращает -1, если он не существует, и выполняет поиск слева направо
Array.Reverse() переворачивает массив
Array.GetLength получает количество элементов
Извлекает элементы массива в соответствии с указанными критериями.
public partial class Frm_Main : Form
{
public Frm_Main()
{
InitializeComponent();
}
private string[] G_str_array;//Определяем поле массива строк
private void Frm_Main_Load(object sender, EventArgs e)
{
G_str_array = new string[] {//Присвоить значение полю массива строк
«Технологии завтрашнего дня», «Словарь программирования C#», «Примеры C#», «Сборник примеров C#»};
for (int i = 0; i { lab_Message.Text += G_str_array[i] + "\n"; } } private void txt_find_TextChanged(object sender, EventArgs e) { If (txt_find.Text != string.Empty)//Определяем, пуста ли строка поиска {//Используйте метод FindAll, чтобы найти соответствующую строку string[] P_str_temp = Array.FindAll (G_str_array, (s) => s.Contains(txt_find.Text)); If (P_str_temp.Length > 0)//Определяем, найдена ли соответствующая строка { txt_display.Clear();//Очистить строку в контроле Foreach (строка s в P_str_temp)//Добавить строку в элемент управления { txt_display.Text += s + Environment.NewLine; } } else { txt_display.Clear();//Очистить строку в контроле txt_display.Text = "Запись не найдена";//Подсказка, что запись не найдена } } else { txt_display.Clear();//Очистить строку в контроле } } } 2 , сортировка массива: Алгоритм QuickSort, используемый классом Array, сортирует элементы массива. Метод Sort() требует, чтобы элементы массива реализовывали интерфейс IComparable. Поскольку простые типы, такие как System.String и Int32, реализуют интерфейс IComparable, элементы, содержащие эти типы, можно сортировать. Если вы настраиваете метод сортировки массива, вы должны реализовать интерфейс IComparable. Этот интерфейс определяет метод CompareTo(), который возвращает 0, если объекты сравнения равны, и возвращает значение меньше 0, если экземпляр должен быть помещен перед объектом параметра, если экземпляр фильма находится в объекте параметра. метод возвращает значение больше 0. Пример. Измените класс Person, чтобы реализовать интерфейс IComparable public class Person : IComparable<Person> { public string FirstName { get; set; } public string LastName { get; set; } public override string ToString() { return String.Format("{0} {1}", FirstName, LastName); } public int CompareTo(Person other) { if (other == null) throw new ArgumentNullException("other"); int result = this.LastName.CompareTo(other.LastName); if (result == 0) { result = this.FirstName.CompareTo(other.FirstName); } return result; } class Program { static void Main() { Person[] persons = GetPersons(); SortPersons(persons); } static Person[] GetPersons() { return new Person[] { new Person { FirstName="Damon", LastName="Hill" }, new Person { FirstName="Niki", LastName="Lauda" }, new Person { FirstName="Ayrton", LastName="Senna" }, new Person { FirstName="Graham", LastName="Hill" } }; } static void SortPersons(Person[] persons) { Array.Sort(persons); foreach (Person p in persons) { Console.WriteLine(p); } } } Второй: если метод сортировки объектов Person отличается от указанного выше или не может быть изменен в классе Person, можно реализовать интерфейс IComparer. Этот интерфейс определяет метод Compare. Сравниваемый класс должен быть связан с этим интерфейсом, а интерфейс IComparer не зависит от сравниваемого класса. пример: namespace Wrox.ProCSharp.Arrays { public enum PersonCompareType { FirstName, LastName } public class PersonComparer : IComparer<Person> { private PersonCompareType compareType; public PersonComparer(PersonCompareType compareType) { this.compareType = compareType; } public int Compare(Person x, Person y) { if (x == null) throw new ArgumentNullException("x"); if (y == null) throw new ArgumentNullException("y"); switch (compareType) { case PersonCompareType.FirstName: return x.FirstName.CompareTo(y.FirstName); case PersonCompareType.LastName: return x.LastName.CompareTo(y.LastName); default: throw new ArgumentException( "unexpected compare type"); } } } } public class Person { public string FirstName { get; set; } public string LastName { get; set; } public override string ToString() { return String.Format("{0} {1}", FirstName, LastName); } } class Program { static void Main() { Person[] persons = GetPersons(); SortUsingPersonComparer(persons); } static void SortUsingPersonComparer(Person[] persons) { Array.Sort(persons, new PersonComparer(PersonCompareType.FirstName)); foreach (Person p in persons) { Console.WriteLine(p); } } static Person[] GetPersons() { return new Person[] { new Person { FirstName="Damon", LastName="Hill" }, new Person { FirstName="Niki", LastName="Lauda" }, new Person { FirstName="Ayrton", LastName="Senna" }, new Person { FirstName="Graham", LastName="Hill" } }; } } Пример сортировки: A1, A2, A10 с Array.Sort(arr); Разряд А1, А10, А2 И то, что я хочу, это A1, A2, A10 public class CustomComparer : System.Collections.IComparer { public int Compare(object x, object y) { string s1 = (string)x; string s2 = (string)y; if (s1.Length > s2.Length) return 1; if (s1.Length < s2.Length) return -1; for (int i = 0; i < s1.Length; i++) { if (s1[i] > s2[i]) return 1; if (s1[i] < s2[i]) return -1; } return 0; } } class Program { static void Main(string[] args) { string[] str = new string[] { "A1 ", "A2 ", "A10 " }; Array.Sort(str, new CustomComparer());//Новый компаратор for (int i = 0; i < str.Length; i++) Console.WriteLine(str[i]); } } 3 , сравнение структур: И массивы, и кортежи реализуют интерфейсы IStructuralEquatable и IStructuralComparable. Эти два интерфейса недавно добавлены Net4.0. Можно сравнивать не только ссылки, но и содержание. Эти интерфейсы реализованы явно, поэтому при их использовании вам необходимо приводить массивы и кортежи к этому интерфейсу. Интерфейс IStructuralEquatable используется для сравнения того, имеют ли два кортежа или массива одинаковое содержимое, а интерфейс IStructuralComparable используется для сортировки кортежей или массивов. пример: public class Person : IEquatable<Person> { public int Id { get; private set; } public string FirstName { get; set; } public string LastName { get; set; } public override string ToString() { return String.Format("{0}, {1} {2}", Id, FirstName, LastName); } public bool Equals(Person other) { if (other == null) throw new ArgumentNullException("other"); return this.FirstName == other.FirstName && this.LastName == other.LastName; } } class Program { static void Main() { var janet = new Person { FirstName = "Janet", LastName = "Jackson" }; Person[] persons1 = { new Person { FirstName = "Michael", LastName = "Jackson" }, janet }; Person[] persons2 = { new Person { FirstName = "Michael", LastName = "Jackson" }, janet }; if (persons1 != persons2) Console.WriteLine("not the same reference"); if (!persons1.Equals(persons2)) Console.WriteLine("equals returns false - not the same reference"); if ((persons1 as IStructuralEquatable).Equals(persons2, EqualityComparer<Person>.Default)) { Console.WriteLine("the same content"); } } } Выходной результат: не та же ссылка equals returns false - not the the same content Пример: Сравнить два массива целых чисел на равенство? int[] arr1 = { 1, 2, 3 };int[] arr2 = { 1, 2, 3 }; if (arr1.Equals(arr2)) { Console.WriteLine("та же");} else { Console.WriteLine("Не то же самое"); } if ((arr1 as IStructuralEquatable).Equals(arr2, EqualityComparer<int>.Default)) { Console.WriteLine("та же");} Пример: сравнение двух кортежей на равенство Класс Tuple предоставляет два метода Equals(): один переопределяет метод Equals() в базовом классе Object и принимает Object в качестве параметра, первый метод передает другой кортеж, этот метод использует EqualityComparer class TupleComparer : IEqualityComparer { public new bool Equals(object x, object y) { bool result = x.Equals(y); return result; } public int GetHashCode(object obj) { return obj.GetHashCode(); } } class Program { static void Main() { var t1 = Tuple.Create<int, string>(1, "Stephanie"); var t2 = Tuple.Create<int, string>(1, "Stephanie"); if (t1 != t2) Console.WriteLine("not the same reference to the tuple"); if (t1.Equals(t2)) Console.WriteLine("equals returns true"); TupleComparer tc = new TupleComparer(); if ((t1 as IStructuralEquatable).Equals(t2, tc)) { Console.WriteLine("yes, using TubpleComparer"); } } }Вывод: не та же ссылка на tupleequals возвращает trueyes, используя TubpleComparer