2009-11-20 20 views
8

Acabo de levantar este fragmento de un sitio web y resultó ser exactamente la solución que necesitaba para mi problema particular.bien, esto funcionó. ¿Qué es exactamente?

No tengo idea de qué se trata (en particular, el delegado y las partes devueltas) y la fuente no lo explica.

Esperando SO puede aclararme.

myList.Sort( delegate(KeyValuePair<String, Int32> x, KeyValuePair<String, Int32> y) 
       { 
       return x.Value.CompareTo(y.Value); 
       } 
      ); 
+8

+1 por querer entender lo que está haciendo en lugar de pasar al siguiente fragmento que encuentre. –

+0

No olvides aceptar una respuesta. –

Respuesta

11

MyList.Sort tiene un parámetro - la función que se encarga de comparar artículos, por lo que la lista se puede ordenar accoding a ella.

Siguiente: delegado (x, y) define la función en sí, que acepta dos parámetros de tipo KeyValuePair [String, Int32].

El contenido en los corchetes {...} es la lógica comparisson real:

return x.Value.CompareTo(y.Value); 

que compara 2 valores enteros de acuerdo con this definition.

Por lo tanto, su lista se ordenará en función de los valores de esos enteros en orden ascendente.


con C# 3.5 Me gustaría volver a escribir así:

mylist.Sort((x,y) => x.Value.CompareTo(y.Value)); 
+0

Con C# 3.0, ¿se puede acortar este código? – Chris

+0

Sí. Actualicé la respuesta. –

+0

Así que bajo el capó, supongo que está sucediendo algo como esto: para cada par de valores clave en esta lista, compare el elemento 'valor' en el par de valor clave actual con el elemento 'valor' en el siguiente par de valor clave. el que es mayor se coloca una ranura más alta que la otra. -am ¿cierro? – fieldingmellish

0
myList.Sort //Sort using a your own compare function 
    (
    // declare the compare function, returns a int, and receives two items 
    delegate(KeyValuePair<String, Int32> x, KeyValuePair<String, Int32> y) 
    { 
     // returns a int indicating whether the items are "equal" - equal being what is implemented it the appropriate compare function. 
     return x.Value.CompareTo(y.Value); 
    } 
); 
+2

Creo que realmente devuelve un int, con 0 siendo igual, menos de 0 siendo x y – Davy8

+2

¡Devuelve INT, NOT BOOLEAN! –

0

pensar de esta manera. Digamos que tenía un método que se veía así:

public int MyComparisonMethod(KeyValuePair<string, int> x, KeyValuePair<string,int> y) 
{ 
    return x.Value.CompareTo(y.Value); 
} 

Esto básicamente toma dos valores y los compara. Devuelve un -1, 0 o 1 dependiendo de si x es menor, igual o mayor que y, respectivamente.

Ahora, debajo de las cubiertas, List.Sort utilizó el algoritmo de clasificación rápida. Todo lo que necesitas entender es que sigue comparando varios elementos en tu lista uno contra el otro. ¿Cómo sabe si el valor a es mayor que, menor o igual que el valor b? Llama a este método y, en base a eso, lo sabe. ¿Tiene sentido?

Así que la idea es que proporcione un mecanismo para comparar dos valores en su lista, y List.Sort lo utiliza para hacer las comparaciones que necesita para la clasificación.

0

Como digo,

Esto es comúnmente utilizado en el caso de que necesite para ordenar una lista de clases personalizadas.

Por ej.

class Student 
{ 
    int rollID; 
    string name; 
} 

List<Student> students = new List<Student>(); 

... 

students.Sort(delegate(Student x, Student y) { return x.rollID.CompareTo(y.rollID);}); 
0

Está implícito, pero puede deberías haber mencionado la declaración de tu "miLista". déjame escribirlo para ti.

var myList=new List<KeyValuePair<string, int>>(); 

Ahora, lo que significa es que cada elemento de esta lista es una instancia de KeyValuePair [cadena, int].

Ahora, a su pregunta.

Una de las sobrecargas del método Sort acepta un delegado "Comparación", que toma dos elementos de una colección y devuelve un número entero.

public delegate int Comparison<T>(T x, T y) 

En esencia, lo que está haciendo es crear un delegado anónimo que compara dos artículos (en su caso, usted está ordenando 'Valor' puede incluso ordenar en 'Clave') usando el método "CompareTo" de IComparable (cadena e int implementan esta interfaz).

IComparable.CompareTo devuelve un número entero (que se utiliza por el método Sort para organizar los elementos en su lista) que indica que lhs es menor que (-1), mayor que (1) o igual a (0) rhs.

FYI: En caso de que esté trabajando en C# 3.0, ni siquiera necesita un delegado anónimo. Se puede utilizar en lugar de expresión lambda (que es un atajo para definir delegado anónima, more?)

por ejemplo:

myList.Sort((x, y) => x.Value.CompareTo(y.Value)); 
//Sort over Value 

myList.Sort((x, y) => x.Key.CompareTo(y.Key)); 
//Sort over key 

Esperamos que la explicación es muy útil.