Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# - using List<T>.Find() with custom objects

I'm trying to use a List<T> with a custom class of mine, and being able to use methods like Contains(), Find(), etc., on the list. I thought I'd just have to overload the operator == but apparently, one way of doing that is to use a delegate method with the Find()...

Note: Right now, I've overloaded the Equals() method to get the Contains() method to work, but I still couldn't get the Find() function to work.

What would be the best way of getting both to work?

I'm using the latest C# /.NET framework version with mono, on linux.

edit: Here's my code

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;     } } 

}

and how I would like to search my Reponse objects using the find() function...

list.find("statement1"); // would return a Reponse object 
like image 236
Pacane Avatar asked Dec 21 '10 01:12

Pacane


2 Answers

Find() will find the element that matches the predicate that you pass as a parameter, so it is not related to Equals() or the == operator.

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

In this case, I have used a lambda expression as a predicate. You might want to read on this. In the case of Find(), your expression should take an element and return a bool.

In your case, that would be:

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

And to answer the question in the comments, this is the equivalent in .NET 2.0, before lambda expressions were introduced:

var response = list.Find(delegate (Response r) {     return r.Statement == "statement1"; }); 
like image 122
Xavier Poinas Avatar answered Oct 05 '22 12:10

Xavier Poinas


You can use find with a Predicate as follows:

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

This will return the first object in the list which meets the conditions defined by the predicate (ie in my example I am looking for an object with an ID).

like image 40
Greg Sansom Avatar answered Oct 05 '22 12:10

Greg Sansom