How to use IndexOf() method of List<object>
Asked Answered
C

6

52

All the examples I see of using the IndexOf() method in List<T> are of basic string types. What I want to know is how to return the index of a list type that is an object, based on one of the object variables.

List<Employee> employeeList = new List<Employee>();
employeeList.Add(new Employee("First","Last",45.00));

I want to find the index where employeeList.LastName == "Something"

Chichihaerh answered 14/10, 2009 at 19:54 Comment(2)
Is there a way to do this without lambda expressions? I'm stuck using .net 2.0Chichihaerh
Can you use my solution below?Boxthorn
G
79
int index = employeeList.FindIndex(employee => employee.LastName.Equals(somename, StringComparison.Ordinal));

Edit: Without lambdas for C# 2.0 (the original doesn't use LINQ or any .NET 3+ features, just the lambda syntax in C# 3.0):

int index = employeeList.FindIndex(
    delegate(Employee employee)
    {
        return employee.LastName.Equals(somename, StringComparison.Ordinal);
    });
Gastrulation answered 14/10, 2009 at 19:57 Comment(2)
I confirm this does the job. However the project doesn't use Linq. We are using .NET 2.0Chichihaerh
@Bay: you can use the old (pre-C# 3) syntax for the anonymous delegates, but the original I wrote would work find in .NET 2 as long as you're compiling with the C# 3 compiler (C# 3.0 and .NET 3.0 are not dependent on each other).Gastrulation
B
26
public int FindIndex(Predicate<T> match);

Using lambdas:

employeeList.FindIndex(r => r.LastName.Equals("Something"));

Note:

// Returns:
//     The zero-based index of the first occurrence of an element
//     that matches the conditions defined by match, if found; 
//     otherwise, –1.
Big answered 14/10, 2009 at 20:1 Comment(0)
N
13

you can do this through override Equals method

class Employee
    {
        string _name;
        string _last;
        double _val;
        public Employee(string name, string last, double  val)
        {
            _name = name;
            _last = last;
            _val = val;
        }
        public override bool Equals(object obj)
        {
            Employee e = obj as Employee;
            return e._name == _name;
        }
    }
Nicki answered 14/10, 2009 at 20:6 Comment(2)
This is the one we used to do in the fisrt dotnet versionNicki
This is actually the only answer that answers the original question - how to use IndexOf() with any object. Everyone else has just suggested using FindIndex() instead ... which is OK, but this answer should get more credit I think.Bland
B
4

Sorry, one more for good measure :)

int index = employees.FindIndex(
      delegate(Employee employee)
        {
           return employee.LastName == "Something";
        });

Edit: - Full Example in .NET 2.0 Project.

class Program
{
    class Employee { public string LastName { get; set; } }
    static void Main(string[] args)
    {
        List<Employee> employeeList = new List<Employee>();
        employeeList.Add(new Employee(){LastName="Something"});
        employeeList.Add(new Employee(){LastName="Something Else"});
        int index = employeeList.FindIndex(delegate(Employee employee) 
                           { return employee.LastName.Equals("Something"); });
        Console.WriteLine("Index:{0}", index);
        Console.ReadKey();
    }
}
Boxthorn answered 14/10, 2009 at 20:16 Comment(2)
Yes, this satisfies my actual request. I am leaving the check mark on the lambda version for other users as they might be using 3.5. Thanks.Chichihaerh
Your example uses the initializer syntax that's only in C# 3. The OP hasn't clearly distinguished whether he's using C# 3 or C# 2, so it's hard to tell what he wants.Gastrulation
P
2

The answer is for those coming here to know why IndexOf() doesn't work.

Your class must override Equals method of object possessing the following declaration.

public override bool Equals(object obj)
Peso answered 17/3, 2020 at 12:35 Comment(0)
M
1

I prefer like this

    private List<Person> persons = List<Person>();

            public PersonService()
            {
                persons = new List<Person>() { 
                    new Person { Id = 1, DOB = DateTime.Today, FirstName = "Pawan", LastName = "Shakya" },
                    new Person { Id = 2, DOB = DateTime.Today, FirstName = "Bibek", LastName = "Pandey" },
                    new Person { Id = 3, DOB = DateTime.Today, FirstName = "Shrestha", LastName = "Prami" },
                    new Person { Id = 4, DOB = DateTime.Today, FirstName = "Monika", LastName = "Pandey" },
                };
            }

public PersonRepository.Interface.Person GetPerson(string lastName)
        {
            return persons[persons.FindIndex(p=>p.LastName.Equals(lastName, StringComparison.OrdinalIgnoreCase))];
        }
Malonis answered 29/9, 2015 at 18:56 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.