Как вернуть list из метода в c
Перейти к содержимому

Как вернуть list из метода в c

  • автор:

Возврат запроса из метода

В этом примере показан способ возврата запроса из метода в качестве возвращаемого значения и параметра out .

Объекты запроса являются составляемыми, что означает возможность возврата запроса из метода. Объекты, представляющие запросы, не сохраняют результирующую коллекцию, а сохраняют действия, необходимые для получения результатов. Преимущество возвращения объектов запроса заключается в том, что их можно комбинировать или изменять. Поэтому любое возвращаемое значение или параметр out метода, который возвращает запрос, должны также иметь этот тип. Если метод материализует запрос в конкретный тип List или Array, считается, что он должен возвращать результаты запроса, а не сам запрос. Переменную запроса, возвращаемую из метода, можно формировать или изменять.

Пример

В следующем примере первый метод QueryMethod1 возвращает запрос в качестве возвращаемого значения, а второй метод QueryMethod2 возвращает запрос в качестве out параметра ( returnQ в примере). Обратите внимание, что в обоих случаях возвращается запрос, а не его результаты.

IEnumerable QueryMethod1(int[] ints) => from i in ints where i > 4 select i.ToString(); void QueryMethod2(int[] ints, out IEnumerable returnQ) => returnQ = from i in ints where i < 4 select i.ToString(); int[] nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; var myQuery1 = QueryMethod1(nums); 

Запрос myQuery1 выполняется в следующем цикле foreach.

foreach (var s in myQuery1)

Наведите указатель myQuery1 мыши на указатель мыши, чтобы просмотреть его тип.

Вы также можете выполнить запрос, возвращаемый напрямую QueryMethod1 , без использования myQuery1 .

foreach (var s in QueryMethod1(nums))

Наведите указатель мыши на вызов, чтобы QueryMethod1 просмотреть тип возвращаемого значения.

QueryMethod2 возвращает запрос в качестве значения параметра out:

QueryMethod2(nums, out IEnumerable myQuery2); // Execute the returned query. foreach (var s in myQuery2)

Запрос можно изменить с помощью композиции запросов. В этом случае предыдущий объект запроса используется для создания нового объекта запроса. Этот новый объект возвращает результаты, отличные от исходного объекта запроса.

myQuery1 = from item in myQuery1 orderby item descending select item; // Execute the modified query. Console.WriteLine("\nResults of executing modified myQuery1:"); foreach (var s in myQuery1)

См. также

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Коллекции

Хотя в языке C# есть массивы, которые хранят в себе наборы однотипных объектов, но работать с ними не всегда удобно. Например, массив хранит фиксированное количество объектов, однако что если мы заранее не знаем, сколько нам потребуется объектов. И в этом случае намного удобнее применять коллекции. Еще один плюс коллекций состоит в том, что некоторые из них реализует стандартные структуры данных, например, стек, очередь, словарь, которые могут пригодиться для решения различных специальных задач. Большая часть классов коллекций содержится в пространстве имен System.Collections.Generic .

Класс List из пространства имен System.Collections.Generic представляет простейший список однотипных объектов. Класс List типизируется типом, объекты которого будут хранится в списке.

Мы можем создать пустой список:

List people = new List();

В данном случае объект List типизируется типом string . А это значит, что хранить в этом списке мы можем только строки.

Можно сразу при создании списка инициализировать его начальными значениями. В этом случае элементы списка помещаются после вызова конструктора в фигурных скобках

List people = new List() < "Tom", "Bob", "Sam" >;

В данном случае в список помещаются три строки

Также можно при создании списка инициализировать его элементами из другой коллекции, например, другого списка:

var people = new List() < "Tom", "Bob", "Sam" >; var employees = new List(people);

Можно совместить оба способа:

var people = new List() < "Tom", "Bob", "Sam" >; var employees = new List(people);

В данном случае в списке employees будет четыре элемента ( < "Tom", "Bob", "Sam", "Mike" >) - три добавляются из списка people и один элемент задается при инициализации.

Начиная с версии C# 12 для определения списков можно использовать выражения коллекций, которые предполагают заключение элементов коллекции в квадратные скобки:

List people = ["Tom", "Bob", "Sam"]; List employees = [];// пустой список

Подобным образом можно работать со списками других типов, например:

List people = new List() < new Person("Tom"), new Person("Bob"), new Person("Sam") >; class Person < public string Name < get;>public Person(string name) => Name = name; >

Установка начальной емкости списка

Еще один конструктор класса List принимает в качестве параметра начальную емкость списка:

List people = new List(16);

Указание начальной емкости списка позволяет в будущем увеличить производительность и уменьшить издержки на выделение памяти при добавлении элементов. Поскольку динамическое добавление в список может приводить на низком уровне к дополнительному выделению памяти, что снижает производительность. Если же мы знаем, что список не будет превышать некоторый размер, то мы можем передать этот размер в качестве емкости списка и избежать дополнительных выделений памяти.

Также начальную емкость можно установить с помощью свойства Capacity , которое имеется у класса List.

Обращение к элементам списка

Как и массивы, списки поддерживают индексы, с помощью которых можно обратиться к определенным элементам:

var people = new List() < "Tom", "Bob", "Sam" >; string firstPerson = people[0]; // получаем первый элемент Console.WriteLine(firstPerson); // Tom people[0] = "Mike"; // изменяем первый элемент Console.WriteLine(people[0]); // Mike

Длина списка

С помощью свойства Count можно получить длину списка:

var people = new List() < "Tom", "Bob", "Sam" >; Console.WriteLine(people.Count); // 3

Перебор списка

C# позволяет осуществить перебор списка с помощью стандартного цикла foreach :/p>

var people = new List() < "Tom", "Bob", "Sam" >; foreach (var person in people) < Console.WriteLine(person); >// Вывод программы: // Tom // Bob // Sam

Также можно использовать другие типы циклов и в комбинации с индексами перебирать списки:

var people = new List() < "Tom", "Bob", "Sam" >; for (int i = 0; i

Методы списка

Среди его методов можно выделить следующие:

  • void Add(T item) : добавление нового элемента в список
  • void AddRange(IEnumerable collection) : добавление в список коллекции или массива
  • int BinarySearch(T item) : бинарный поиск элемента в списке. Если элемент найден, то метод возвращает индекс этого элемента в коллекции. При этом список должен быть отсортирован.
  • void CopyTo(T[] array) : копирует список в массив array
  • void CopyTo(int index, T[] array, int arrayIndex, int count) : копирует из списка начиная с индекса index элементы, количество которых равно count, и вставляет их в массив array начиная с индекса arrayIndex
  • bool Contains(T item) : возвращает true , если элемент item есть в списке
  • void Clear() : удаляет из списка все элементы
  • bool Exists(Predicate match) : возвращает true , если в списке есть элемент, который соответствует делегату match
  • T? Find(Predicate match) : возвращает первый элемент, который соответствует делегату match. Если элемент не найден, возвращается null
  • T? FindLast(Predicate match) : возвращает последний элемент, который соответствует делегату match. Если элемент не найден, возвращается null
  • List FindAll(Predicate match) : возвращает список элементов, которые соответствуют делегату match
  • int IndexOf(T item) : возвращает индекс первого вхождения элемента в списке
  • int LastIndexOf(T item) : возвращает индекс последнего вхождения элемента в списке
  • List GetRange(int index, int count) : возвращает список элементов, количество которых равно count, начиная с индекса index.
  • void Insert(int index, T item) : вставляет элемент item в список по индексу index. Если такого индекса в списке нет, то генерируется исключение
  • void InsertRange(int index, collection) : вставляет коллекцию элементов collection в текущий список начиная с индекса index. Если такого индекса в списке нет, то генерируется исключение
  • bool Remove(T item) : удаляет элемент item из списка, и если удаление прошло успешно, то возвращает true. Если в списке несколько одинаковых элементов, то удаляется только первый из них
  • void RemoveAt(int index) : удаление элемента по указанному индексу index. Если такого индекса в списке нет, то генерируется исключение
  • void RemoveRange(int index, int count) : параметр index задает индекс, с которого надо удалить элементы, а параметр count задает количество удаляемых элементов.
  • int RemoveAll((Predicate match)) : удаляет все элементы, которые соответствуют делегату match. Возвращает количество удаленных элементов
  • void Reverse() : изменяет порядок элементов
  • void Reverse(int index, int count) : изменяет порядок на обратный для элементов, количество которых равно count, начиная с индекса index
  • void Sort() : сортировка списка
  • void Sort(IComparer? comparer) : сортировка списка с помощью объекта comparer, который передается в качестве параметра

Добавление в список

List people = new List () < "Tom" >; people.Add("Bob"); // добавление элемента // people = < "Tom", "Bob" >; people.AddRange(new[] < "Sam", "Alice" >); // добавляем массив // people = < "Tom", "Bob", "Sam", "Alice" >; // также можно было бы добавить другой список // people.AddRange(new List()< "Sam", "Alice" >); people.Insert(0, "Eugene"); // вставляем на первое место // people = < "Eugene", "Tom", "Bob", "Sam", "Alice" >; people.InsertRange(1, new string[] ); // вставляем массив с индекса 1 // people = < "Eugene", "Mike", "Kate", "Tom", "Bob", "Sam", "Alice" >; // также можно было бы добавить другой список // people.InsertRange(1, new List()< "Mike", "Kate" >);

Удаление из списка

var people = new List () < "Eugene", "Mike", "Kate", "Tom", "Bob", "Sam", "Tom", "Alice" >; people.RemoveAt(1); // удаляем второй элемент // people = < "Eugene", "Kate", "Tom", "Bob", "Sam", "Tom", "Alice" >; people.Remove("Tom"); // удаляем элемент "Tom" // people = < "Eugene", "Kate", "Bob", "Sam", "Tom", "Alice" >; // удаляем из списка все элементы, длина строки которых равна 3 people.RemoveAll(person => person.Length == 3); // people = < "Eugene", "Kate", "Alice" >; // удаляем из списка 2 элемента начиная с индекса 1 people.RemoveRange(1, 2); // people = < "Eugene">; // полностью очищаем список people.Clear(); // people = < >;

Поиск и проверка элемента

var people = new List () < "Eugene", "Mike", "Kate", "Tom", "Bob", "Sam" >; var containsBob = people.Contains("Bob"); // true var containsBill = people.Contains("Bill"); // false // проверяем, есть ли в списке строки с длиной 3 символа var existsLength3 = people.Exists(p => p.Length == 3); // true // проверяем, есть ли в списке строки с длиной 7 символов var existsLength7 = people.Exists(p => p.Length == 7); // false // получаем первый элемент с длиной в 3 символа var firstWithLength3 = people.Find(p => p.Length == 3); // Tom // получаем последний элемент с длиной в 3 символа var lastWithLength3 = people.FindLast(p => p.Length == 3); // Sam // получаем все элементы с длиной в 3 символа в виде списка List peopleWithLength3 = people.FindAll(p => p.Length == 3); // peopleWithLength3

Получение диапазона и копирование в массив

List people = new List() ; // получаем диапазон со второго по четвертый элемент var range = people.GetRange(1, 3); // range = < "Tom", "Mike", "Sam">; // копируем в массив первые три элемента string[] partOfPeople = new string[3]; people.CopyTo(0, partOfPeople, 0, 3); // partOfPeople = < "Eugene", "Tom", "Mike">;

Расположение элементов в обратном порядке

var people = new List () < "Eugene", "Tom", "Mike", "Sam", "Bob" >; // переворачиваем весь список people.Reverse(); // people = < "Bob","Sam", "Mike", "Tom", "Eugene">; var people2 = new List() < "Eugene", "Tom", "Mike", "Sam", "Bob" >; // переворачиваем часть только 3 элемента с индекса 1 people2.Reverse(1, 3); // people2 = < "Eugene","Sam", "Mike", "Tom", "Bob" >;

Как вернуть несколько значений из метода java

В Java мы не можем вернуть несколько значений из метода, только одно. Но мы можем возвратить массив, список или мапу, содержащие нужные нам данные. Например :

public static ListInteger> func()  int a = 1; int b = 2; return List.of(a, b); > 

Также можно описать класс, содержащий несколько переменных разных типов, и вернуть объект этого класса.

public class MyClass  // необходимо вернуть число и строку private int n; private String str; public MyClass(int n, String str)  this.n = n; this.str = str; > public int getN()  return n; > public String getStr()  return str; > > // метод, возвращающий несколько значений в виде объекта public static MyClass func()  return new MyClass(5, "Ivan"); // создаем объект нашего класса и возвращаем его > 

Вызов метода и получение объекта с несколькими параметрами :

MyClass x = func(); // получаем объект нашего класса System.out.println(x.getN() + " " + x.getStr()); // => 5 Ivan 

Как вернуть list из метода в c

Метод может возвращать значение, какой-либо результат. В примере выше были определены два метода, которые имели тип void . Методы с таким типом не возвращают никакого значения. Они просто выполняют некоторые действия.

Но методы также могут возвращать некоторое значение. Для этого применяется оператор return , после которого идет возвращаемое значение:

return возвращаемое значение;

Например, определим метод, который возвращает значение типа string :

string GetMessage()

Метод GetMessage имеет тип string , следовательно, он должен возвратить строку. Поэтому в теле метода используется оператор return , после которого указана возвращаемая строка.

При этом методы, которые в качестве возвращаемого типа имеют любой тип, кроме void , обязательно должны использовать оператор return для возвращения значения. Например, следующее определение метода некорректно:

string GetMessage()

Также между возвращаемым типом метода и возвращаемым значением после оператора return должно быть соответствие. Например, в следующем случае возвращаемый тип - string , но метод возвращает число (тип int), поэтому такое определение метода некорректно:

string GetMessage() < return 3; // Ошибка! Метод должен возвращать строку, а не число >

Результат методов, который возвращают значение, мы можем присвоить переменным или использовать иным образом в программе:

string GetMessage() < return "Hello"; >string message = GetMessage(); // получаем результат метода в переменную message Console.WriteLine(message); // Hello

Метод GetMessage() возвращает значение типа string . Поэтому мы можем присвоить это значение какой-нибудь переменной типа string: string message = GetMessage();

Либо даже передать в качестве значения параметру другого метода:

string GetMessage() < return "Hello"; >void PrintMessage(string message) < Console.WriteLine(message); >PrintMessage(GetMessage());

В вызове PrintMessage(GetMessage()) сначада вызывается метод GetMessage() и его результат передается параметру message метода PrintMessage

После оператора return также можно указывать сложные выражения или вызовы других методов, которые возвращают определенный результат. Например, определим метод, который возвращает сумму чисел:

int Sum(int x, int y) < return x + y; >int result = Sum(10, 15); // 25 Console.WriteLine(result); // 25 Console.WriteLine(Sum(5, 6)); // 11

Метод Sum() имеет тип int , следовательно, он должен возвратить значение типа int - целое число. Поэтому в теле метода используется оператор return , после которого указано возвращаемое число (в данном случае результат суммы переменных x и y).

Сокращенная версия методов с результатом

Также мы можем сокращать методы, которые возвращают значение:

string GetMessage()

аналогичен следующему методу:

string GetMessage() => "hello";

int Sum(int x, int y)

аналогичен следующему методу:

int Sum(int x, int y) => x + y;

Выход из метода

Оператор return не только возвращает значение, но и производит выход из метода. Поэтому он должен определяться после остальных инструкций. Например:

string GetHello()

С точки зрения синтаксиса данный метод корректен, однако его инструкция Console.WriteLine("After return") не имеет смысла - она никогда не выполнится, так как до ее выполнения оператор return возвратит значение и произведет выход из метода.

Однако мы можем использовать оператор return и в методах с типом void . В этом случае после оператора return не ставится никакого возвращаемого значения (ведь метод ничего не возвращает). Типичная ситуация - в зависимости от опеределенных условий произвести выход из метода:

void PrintPerson(string name, int age) < if(age >120 || age < 1) < Console.WriteLine("Недопустимый возраст"); return; >Console.WriteLine($"Имя: Возраст: "); > PrintPerson("Tom", 37); // Имя: Tom Возраст: 37 PrintPerson("Dunkan", 1234); // Недопустимый возраст

Здесь метод PrintPerson() в качестве параметров принимает имя и возраст пользователя. Однако в методе вначале мы проверяем, соответствует ли возраст некоторому диапазону (меньше 120 и больше 0). Если возраст находится вне этого диапазона, то выводим сообщение о недопустимом возрасте и с помощью оператора return выходим из метода. После этого метод заканчивает свою работу.

Однако если возраст корректен, то выводим информацию о пользователе на консоль. Консольный вывод:

Имя: Tom Возраст: 37 Недопустимый возраст

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *