Пример инициализации C # LINQ / Object из C # 4.0 в двух словах - PullRequest
2 голосов
/ 13 августа 2010

Я не уверен, что понимаю, как работает следующий пример. Это из C # 4.0 в двух словах .

class Program
{
    static void Main(string[] args)
    {
        string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };

        IEnumerable<TempProjectionItem> temp =
            from n in names
            select new TempProjectionItem
            {
                Original = n,
                Vowelless = n.Replace("a", "").Replace("e", "").Replace("i", "")
                             .Replace("o", "").Replace("u", "")
            };

        IEnumerable<string> query = from   item in temp
                                    where  item.Vowelless.Length > 2
                                    select item.Original;

        foreach (string item in query)
        {
            Console.WriteLine(item);
        }
    }

    class TempProjectionItem
    {
        public string Original;
        public string Vowelless;
    }
}

IEnumerable это интерфейс, не так ли? Что это за объекты temp и query? Почему TempProjectionItem не нужно реализовывать IEnumerable?

Ответы [ 2 ]

3 голосов
/ 13 августа 2010

TempProjectionItem является типом элемента типа последовательности ... точно так же, как IEnumerable<int> (например, List<int>) представляет собой последовательность значений int без самой реализации intIEnumerable.

Обратите внимание, что есть два интерфейса последовательности: System.Collections.IEnumerable и System.Collections.Generic.IEnumerable<T>.Очевидно, что последний является общим, представляя последовательность определенного типа.Таким образом, temp - это последовательность TempProjectionItem элементов, а query - это последовательность string элементов.

Ни один из них на самом деле не является коллекцией как таковой - запросы выполняются лениво - это толькооценивается (начиная с names), когда вы перебираете данные.Итерация по query включает в себя итерацию по temp, которая затем повторяется по names.

0 голосов
/ 13 августа 2010
IEnumerable is an interface, isn't it? 

Да, это так. На самом деле в вашем коде вы используете IEnumerable<T>, который является универсальным интерфейсом.

What kind of object is temp and query?

В вашем коде мы видим, что temp - это тип IEnumerable<TempProjectionItem>, а запрос - IEnumerable<string>, оба из которых происходят от IEnumerable<T>.

Why does TempProjectionItem not need to implement IEnumerable?

TempProjectionItem не является IEnumerable, это просто элемент IEnumerable<TempProjectionItem>, который является «контейнером».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...