2010-12-21 6 views
35

Estoy intentando utilizar un List<T> con una clase personalizada de la mina, y ser capaz de utilizar métodos como Contains(), Find(), etc., en la lista. Pensé que simplemente tendría que sobrecargar el operador == pero al parecer, una forma de hacer esto es utilizar un método delegado con Find() ...C# - utilizando Lista <T> .find() con la costumbre objetos

Nota: En este momento, he sobrecargado el método para obtener Equals() el método Contains() funciona, pero todavía no pude hacer funcionar la función Find().

¿Cuál sería la mejor manera de conseguir que ambos trabajen?

Estoy usando la última versión de C#/.NET framework con mono, en linux.

editar: Aquí está mi código

using System; 
namespace GuerreDesClans 
{ 
public class Reponse : IEquatable<Reponse> 
{ 
    public Reponse() 
    { 
     m_statement = string.Empty; 
     m_pointage = 0; 
    } 

    public Reponse (string statement, int pointage) 
    { 
     m_pointage = pointage; 
     m_statement = statement; 
    } 


    /* 
    * attributs privés 
    */ 

    private string m_statement; 
    private int m_pointage; 


    /* 
    * properties 
    */ 

    public string Statement { 
     get { return m_statement; } 
     set { m_statement = value; } 
    } 

    public int Pointage { 
     get { return m_pointage; } 
     set { m_pointage = value; } 
    } 

    /* 
    * Equatable 
    */ 

    public bool Equals (Reponse other) 
    { 
     if (this.m_statement == other.m_statement) 
      return true; 
     else 
      return false; 
    } 
} 

}

y cómo me gustaría buscar mis objetos RÉPONSE utilizando la función de búsqueda() ...

list.find("statement1"); // would return a Reponse object 
+1

Cómo son usted que llama 'find'? – SLaks

+3

Muestra un código. –

Respuesta

49

Find() encontrará el elemento que coincide con el predicado que pasa como parámetro, por lo que no está relacionado con Equals() o el operador ==.

var element = myList.Find(e => [some condition on e]); 

En este caso, he utilizado una lambda expression como un predicado. Es posible que desee leer sobre esto. En el caso de Find(), su expresión debe tomar un elemento y devolver un bool.

En su caso, eso sería:

var reponse = list.Find(r => r.Statement == "statement1") 

Y para responder a la pregunta en los comentarios, esto es el equivalente en .NET 2.0, antes de la introducción expresiones lambda:

var response = list.Find(delegate (Response r) { 
    return r.Statement == "statement1"; 
}); 
+1

¿Puede proporcionar un ejemplo de .NET 2.0? Estoy en Unity3D que está atrapado en .net 2.0 land – gman

+0

Claro, he editado mi respuesta. –

+0

¿Está bien pensar que el elemento devuelto será una referencia y que las modificaciones se reflejarán en el mismo elemento que figura en la lista? –

44

Se puede utilizar encontrar con un predicado de la siguiente manera:

list.Find(x => x.Id == IdToFind); 

Esto devolverá el primer objeto de la lista que cumpla las condiciones definidas por el predicado (es decir, en mi ejemplo, estoy buscando un objeto con una ID).

+0

¿cómo se llama esta técnica? – Pacane

+1

@Pacane: de msdn: todas las expresiones lambda utilizan el operador lambda =>, que se lee como "va a" –

5

Las respuestas anteriores no tienen en cuenta el hecho de que ha sobrecargado el operador de iguales y está utilizando eso para probar el elemento buscado. En ese caso, el código se vería así:

list.Find(x => x == objectToFind); 

O, si no te gusta la sintaxis lambda, y tienen Object.equals sobrecargadas (objeto) o han implementado IEquatable <T>, usted puede hacer esto :

list.Find(objectToFind.Equals); 
+0

Estas declaraciones son redundantes porque ya tenemos una referencia a objectToFind. El punto de Buscar() es ubicar un objeto al que no tenemos referencia. Es mucho más fácil, más lógico y legible de usar list.Contains (objectToFind). –

+1

@Greg Sansom: por supuesto. Pero el OP dijo específicamente que tiene el método Contains funcionando, pero también quiere usar Find. Como ha reemplazado Igual para comparar m_statement e ignorar el valor de m_pointage, el método Find no necesariamente devolverá la misma instancia que se le pasa. El comportamiento de la anulación de Igualdad puede ser cuestionable, pero dado ese comportamiento, 'list.Find (obj.Equals)' no es redundante. – phoog

1

http://msdn.microsoft.com/en-us/library/x0b5b5bc.aspx

 // Find a book by its ID. 
     Book result = Books.Find(
     delegate(Book bk) 
     { 
      return bk.ID == IDtoFind; 
     } 
     ); 
     if (result != null) 
     { 
      DisplayResult(result, "Find by ID: " + IDtoFind); 
     } 
     else 
     { 
      Console.WriteLine("\nNot found: {0}", IDtoFind); 
     } 
Cuestiones relacionadas