Что такое IEnumerable в. Net и как запрос linq sql можно сохранить как тип объекта IEnumerable - PullRequest
0 голосов
/ 04 августа 2020

Я новичок в IEnumerable в. Net. Я хочу знать, что возвращает запрос LINQ SQL, который можно сохранить как тип объекта IEnumerable.

Мой код:

IEnumerable<int> result=(from value in Enumerable.Range(0, 10) where value%2==0 select value);
foreach(int v in result){Console.Write(v+" ");}

Я понимаю - * Запрос 1008 * возвращает коллекцию / список перечисляемых объектов int.

Вопрос 1: Но IEnumerable - это интерфейс, поэтому как мы можем создать экземпляр IEnumerable, например IEnumerable<int> result.

Вопрос 2: Это объект типа значения или ссылочный тип?

Пожалуйста, помогите мне понять это.

1 Ответ

0 голосов
/ 05 августа 2020

Вопрос 1: Технически вы не можете создать экземпляр интерфейса. Просмотрите https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1?view=netcore-3.1, чтобы узнать больше об интерфейсе c. Но, что более важно, интерфейс (в этом контексте) больше похож на контракт, который должен (иметь) класс. Так что любая коллекция может быть IEnumerable. Так, например, целочисленный массив реализует интерфейс:

    IEnumerable<int> example = new[] { 1, 2, 3 };

будет работать нормально (при условии, что вы добавили пространство имен System.Collections.Generic в использование).

Вопрос 2 : collections (в этом контексте) почти всегда являются ссылочными типами

Вопрос в заголовке: это может быть менее интересно для того, чего вы хотите достичь, но для получения дополнительной информации о фактическом возвращаемом типе: WhereEnumerableIterator см. это ( немного глубже) объяснение: https://marcinjuraszek.com/2013/08/did-you-know-about-that-linq-feature.html Но, если вы хотите иметь возможность поместить полученную коллекцию в конкретный тип коллекции по вашему выбору, вы можете просто создать свой собственный новый экземпляр коллекции, например, добавление ToArray из пространства имен System.Linq, например:

int[] result = (from value in Enumerable.Range(0, 10) where value%2==0 select value).ToArray();

'result', в свою очередь, реализует IEnumerable<int>. В общем, интерфейсы отделяют фактические реализации от желаемого поведения. Таким образом, вам действительно не нужно беспокоиться о базовом конкретном классе, но сосредоточьтесь на том, что вам нужно (набор целых чисел в коллекции, которую вы хотите l oop).

Надеюсь, это поможет / немного объясняет ..

...