Как работает Select

180
17 августа 2018, 19:20

Мне непонятен фрагмент .Select(n => Convert.ToInt32(n)). Что именно делает .Select и что это за n? Откуда она и какой имеет тип и когда этот тип был присвоен? Простите за, возможно, глупый вопрос, но я не понимаю, а на MSDN не нахожу пояснений внятных. или скажите что изучить чтобы это понять?

using System;
using System.IO;
using System.Text;
using System.Linq;
namespace my
{
class MainClass
{
    public static void Main(string[] args)
    {
        while (true)
        {
            Func(Console.ReadLine().Trim());
        }
    }
    static void Func(string text)
    {
        try
        {
            int[] arr = text.Split(',', ';').Select(n => Convert.ToInt32(n)).ToArray();
            for (int i = 0; i < arr.Length; i++)
            {
                Array.Sort(arr);
                Console.Write(arr[i] + "| ");
            }
            Console.Write("\n");
        }
        catch (FormatException)
        {
            Console.WriteLine("Вводи значения через зяпятую(,) или точку с запятой(;)");
            Func(Console.ReadLine());
        }
    }
}

}

Answer 1

Вы используете лямбда-выражение. Select, Where, Any и прочие функции LINQ являются методами расширения и применяются к любому типу, который реализует интерфейс IEnumerable.

Вкратце результат Split возвращает массив, который используется для итерации методом Select, где n имеет тип string и выступает входным параметром функции. Любую LINQ функцию можно развернуть в обычный foreach.

var arr = new List<int>();
foreach (var s in  text.Split(',', ';'))
{
    arr.Add(Convert.ToInt32(s));
}

LINQ расширения существенно сокращают объем кода, который должен написать программист.

Answer 2

К выше существующим ответам добавлю свою толику. Вы можете написать свой Select() примерно так

class Program
{
    static void Main(string[] args)
    {
        IEnumerable<int> res = "2,4,8;9;5".Split(',', ';')
                                  .MySelect(n => Int32.Parse(n));
    }

}
public static class MyExtensions
{
    public static IEnumerable<TResult> MySelect<TValue, TResult>(this IEnumerable<TValue> values, Func<TValue, TResult> func)
    {
        foreach (TValue item in values)
        {
            yield return func(item);
        }
    }
}
Answer 3

Метод Select в качестве параметра принимает функцию, которая вызывается последовательно с каждым элементом из набора, возвращаемого text.Split. Параметр этой функции здесь назван n - находится слева от знака =>. То, что находится справа от знака => - значение, возвращаемое этой функцией. Из этих возвращаемых значений формируется набор, возвращаемый функцией Select.

READ ALSO
Свойства интерфейсов С#

Свойства интерфейсов С#

Есть простая структура:

190
Дать каждому файлу рандомное имя

Дать каждому файлу рандомное имя

Создал массив с путями до файлов и создал коллекцию в которую поместил массивДалее написал цикл, который копирует содержимое файлов и дает...

166
Unity. Сцена стала долго грузиться

Unity. Сцена стала долго грузиться

Всем привет! Проблема такая: 18 июня у меня сцена в мобильной игре грузилась за 1-2 секунды, а вот 30 июня сцена стала грузиться 5-6-7 секундКод почти...

149
CefSharp Не проходит reCAPTCHA

CefSharp Не проходит reCAPTCHA

Использую последнюю версию CefSharpWPF (x64 проект)

131