2013-06-23 4 views
1

Say У меня есть следующий код: Объект реализует интерфейс IEnumerable C#?

using System; 
using System.Linq; 
using System.Collections.Generic; 
public class Developer 
{ 
    public string Name; 
    public string Language; 
    public int Age; 
} 

class App { 
    static void Main() { 
     Developer[] developers = new Developer[] { 
      new Developer {Name = "Paolo", Language = "C#"}, 
      new Developer {Name = "Marco", Language = "C#"}, 
      new Developer {Name = "Frank", Language = "VB.NET"}}; 
     var developersUsingCSharp = from d in developers 
            where d.Language == "C#" 
            select d.Name; 
     foreach (var item in developersUsingCSharp) { 
      Console.WriteLine(item); 
     } 
    } 
} 

Я явно не реализован интерфейс IEnumerable<T>. Мой вопрос заключается в том, что предложение from принимает экземпляры типов, которые реализуют интерфейс IEnumerable, но в этом случае это определенный пользователем тип класса разработчика

Пример кода взято из LINQ в книге Microsoft .NET Framework.

+3

Вы используете '' foreach' на developersUsingCSharp', который является '' IEnumerable . Параметр 'var' ключевого слова не означает «Этот тип -« Объект », это означает« Я дам компилятору решить, что такое тип ». Вам следует избегать использования var из-за путаницы, такой как этот. –

+4

' var' имеет некоторые определенные преимущества. Я бы стеснялся советовать кому-то, чтобы не использовать его полностью. Но есть смысл использовать явные объявления, пока у вас не будет четкого понимания типов в .NET. – StriplingWarrior

+0

@Joushua Я думал, что я редактировал вопрос. Мой вопрос - это предложение из статьи взять i nstances типов, которые реализуют интерфейс IEnumerable , но в этом случае это тип класса разработчика, определенный пользователем. – ckv

ответ

9

System.Array (что вы создаете при использовании Developer[] обозначений Реализует IEnumerable.

+0

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

+0

@ckv связанная статья MSDN содержит много информации об этом. У вас есть конкретный вопрос? –

+0

Я получаю это сейчас. Так что это недостающая связь, о которой я не знал. – ckv

2

В силу того, что ваш присваивающей переменную developersUsingCSharp в результате запроса Linq, это типа IEnumerable<string> (это было бы IQueryable<string>, если это был объект рамки запроса или нечто подобное).

Возможно, трудно точно проанализировать, что происходит с синтаксисом запроса. Запрос:

var developersUsingCSharp = 
    from d in developers 
    where d.Language == "C#" 
    select d.Name; 

эквивалентно беглом синтаксисом:

var developersUsingCSharp = 
    developers.Where(d => d.Language == "C#") 
       .Select(d => d.Name); 

В Linq Select и Where методы расширения и принимать IEnumerable<T> и вернуть IEnumerable<T> в результате. Таким образом, вы можете определенно использовать результат foreach.

+0

Добавил комментарий к моему вопросу. Я перефразировал свой вопрос. – ckv

+0

@ckv Я предполагал, что путаница была связана с запросом linq, а не с более ранним объявлением массива. Кажется, [* HighCore *] (http://stackoverflow.com/a/17257579/1715579) предоставил достаточный ответ, чтобы объяснить, почему массивы перечислимы, но я оставлю свой ответ здесь для полноты. –