Pergunta

Estou muito confuso sobre esse problema e não consigo entender. No Enumerable Documentação, eu li isso:

que implementam System.Collection.Genic.ienumerable

e alguns métodos como Select() Retorna IEnumerable<TSource> que podemos usar de outros métodos como Where() Depois de usar isso. Por exemplo:

names.Select(name => name).Where(name => name.Length > 3 );

mas Enumerable não herdar de IEnumerable<T> e IEnumerable<T> não contém Select(),Where() E etc também ...

Eu já errado?
ou existe algum motivo para isso?

Foi útil?

Solução

O select (), onde () etc são "Métodos de extensão"Eles precisam ser definidos" em outros lugares "como uma interface não pode fornecer uma implementação de métodos.

Você pode reconhecer os métodos de extensão pela palavra -chave "isto" na lista de argumentos. Por exemplo:

public static IEnumerable<TSource> Where<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, bool> predicate
)

pode ser usado como se fosse um método em um IEnumerable<TSource> com um parâmetro: Func<TSource, bool> predicate.

Outras dicas

Correto. Mas e essa frase?

que implementam System.Collection.Genic.ienumerable

De acordo com esta frase, temos que definir métodos no IEnumerable<T> interface e implementar no Enumerable aula por herança. está correto?

Por que métodos de extensão preferidos contra herança?

Ienumerable veio antes IEnumerable<T>, que é uma interface 2.0+.

"Por que os métodos de extensão preferidos contra a herança?"

Enumerable é uma classe estática que implementa mais de 50 métodos de extensão para ienumerable. Isso permite que você use todos esses métodos de extensão em tipos que implementam o IEnumerable sem forçar os programadores a implementar todos esses métodos para cada tipo de coleção. Se enumerável fosse uma interface em vez de uma classe estática, cada tipo de coleção (como lista, dicionário, conjunto etc.) teria sua própria implementação desses métodos de extensão.

Uma maneira de resolver isso é lançar os elementos para o mesmo tipo usando Cast<T>() método que retorna e IEnumerable<T> versão dos mesmos elementos.

DataTable dt = ...
dt.Rows.Cast<DataRow>().Where()...

Rows é do tipo IEnumerable, e depois de lançar, fica do tipo IEnumerable<DataRow>, que é suportado pelos métodos de extensão LINQ.

Eu disse que você também tem uma leitura deste artigo Iteradores, blocos de iterador e pipelines de dados por Jon Skeet para obter mais informações

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top