2009-12-01 15 views
5

Qualcuno può aiutarmi a smontare gli elementi qui e aiutarmi a capire cosa sono?OrderByDescending() per MSDN, cosa diavolo significa?

public static IOrderedEnumerable<TSource> OrderByDescending<TSource, TKey>(
    this IEnumerable<TSource> source, 
    Func<TSource, TKey> keySelector 
) 

Che cos'è TSource e TKey? Cos'è un keySelector? Che diamine è un IOrderedEnumerable?

Cosa fa Func <> ??

Perché MSDN è così criptico?

+1

Non hai già posto una domanda incredibilmente simile? http://stackoverflow.com/questions/1827209/how-did-you-learn-master-c-linq-to-sql – Brandon

+1

no, ma mentre stavo scrivendo quella domanda ho deciso di chiedere a questo di ottenere dettagli su questa cosa , quell'altra domanda riguardava l'apprendimento di LINQ to SQL, questo riguarda questo specifico blocco di codice. – BigOmega

+1

Immagino che dovresti imparare le classi generiche e le espressioni lambda. MSDN non sembrerà più criptico. –

risposta

11

Break Down

  • TSource: Questo è il tipo di elementi della collezione che devono essere ordinati
  • TKey: La chiave tipo con cui gli elementi sono ordinati.
  • Func<TSource,TKey>: delegato che restituisce una chiave per un dato elemento della collezione

Questa funzione è essenzialmente una funzione di ordinamento. Come tale ha bisogno di un modo per confrontare gli elementi nella collezione. Questo particolare metodo presuppone che per un dato oggetto ci sia un valore chiave corrispondente con il quale possono essere ordinati.

Prendiamo ad esempio la seguente classe di studenti

class Student { 
    string Name { get; set; } 
    ... 
} 

Se volessi ordinare una collezione di Student casi con il loro nome ho potuto fare quanto segue

IEnumerable<Student> col = GetTheStudents(); 
var ordered = col.OrderByDescending(x => x.Name); 

In questo caso i valori sarebbero come segue

  • TSource: Student
  • TKey: String
  • Func<TSource,TKey>: Questo è il passato in espressione lambda x => x.Name
+0

Grande risposta, un'altra cosa: ho problemi a capire dove si ottiene x, o x è stato dichiarato proprio lì? Perché l '"uguale al nostro più grande di"? – BigOmega

+0

Allo stesso modo cosa succede se metti '=' o se metti '= <' (uguale o minore di)? – BigOmega

+2

@Ryan, x è dichiarato come parte dell'espressione lambda. Una forma più espansa è la seguente: delegate (stringa x) {return x.Name;} – JaredPar

3

mi chiedo, che cosa è esattamente chiaro su MSDN? Qui è l'argomento: http://msdn.microsoft.com/en-us/library/bb548916.aspx

e qui ci sono alcune risposte alle tue domande da tale argomento:

Parametri di tipo

TSource - Il tipo degli elementi della sorgente.

TKey - Il tipo di chiave restituita da keySelector.

Parametri

fonte - Una sequenza di valori su ordinazione.

keySelector - Una funzione per estrarre una chiave da un elemento.

comparer - Un IComparer per confrontare le chiavi.

Return Value

Un IOrderedEnumerable i cui elementi sono ordinati in ordine decrescente in base a una chiave.

Inoltre, ci sono commenti e un esempio. Quello che hai postato qui è solo una firma del metodo.

+0

ok hai ragione, ero solo frustrato, suppongo che non sia MSDN che è criptico per me è il LINQ :) – BigOmega

+1

I ' d dire che non è solo LINQ. C# è cambiato molto da 1.0 a 3.0. Probabilmente, ti sarà utile avere un buon libro su C# 3.0 e leggere generici, metodi di estensione, espressioni lambda, delegati e sì, LINQ. In questo momento sembra che tu non possa semplicemente leggere la nuova sintassi C#. –