2009-10-14 2 views
41

Alle Beispiele, die ich bei der Verwendung der IndexOf()-Methode in List<T> sehe, sind grundlegende String-Typen. Was ich wissen möchte ist, wie man den Index eines Listentyps, der ein Objekt ist, basierend auf einer der Objektvariablen zurückgibt.So verwenden Sie die IndexOf() -Methode der Liste <object>

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

Ich mag den Index finden, wo employeeList.LastName == "Something"

+0

Gibt es eine Möglichkeit, diese Ausdrücke ohne Lambda zu tun? Ich stecke mit .net 2.0 fest – omencat

+0

Können Sie meine Lösung unten verwenden? –

Antwort

62
int index = employeeList.FindIndex(employee => employee.LastName.Equals(somename, StringComparison.Ordinal)); 

Edit: Ohne lambda für C# 2.0 (das Original verwendet LINQ nicht oder jede .NET 3+ Funktionen, nur die Lambda-Syntax in C# 3.0):

int index = employeeList.FindIndex(
    delegate(Employee employee) 
    { 
     return employee.LastName.Equals(somename, StringComparison.Ordinal); 
    }); 
+0

Ich bestätige, dass dies den Job macht. Das Projekt verwendet jedoch nicht Linq. Wir verwenden .NET 2.0 – omencat

+1

@Bay: Sie können die alte (pre-C# 3) Syntax für die anonymen Delegaten verwenden, aber das Original, das ich geschrieben habe, würde in .NET 2 finden, solange Sie mit dem C# 3 kompilieren Compiler (C# 3.0 und .NET 3.0 sind nicht voneinander abhängig). –

20
public int FindIndex(Predicate<T> match); 

Mit Lambdas:

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

Hinweis:

// Returns: 
//  The zero-based index of the first occurrence of an element 
//  that matches the conditions defined by match, if found; 
//  otherwise, –1. 
8

Sie dies durch Überschreibung tun können Equals Methode

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

Hässliche Lösung ... – Kamarey

+1

Dies ist die, die wir in der ersten Version von dotnet gemacht haben –

+5

Dies ist eigentlich die einzige Antwort, die die ursprüngliche Frage beantwortet - wie man 'IndexOf()' mit irgendeinem Objekt verwendet. Alle anderen haben nur vorgeschlagen, 'FindIndex()' stattdessen zu verwenden ... was in Ordnung ist, aber diese Antwort sollte mehr Kredit bekommen, denke ich. – codeulike

4

Hilf uns dabei, mehr für eine gute Maßnahme :)

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

Edit: - Voll Beispiel in .NET 2.0 Projekt.

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(); 
    } 
} 
+0

Ja, das erfüllt meine eigentliche Anfrage. Ich lasse das Häkchen bei der Lambda-Version für andere Benutzer, wie sie 3.5 verwenden. Vielen Dank. – omencat

+0

Cool, froh, dass es funktioniert. –

+0

Ihr Beispiel verwendet die Initialisierersyntax, die nur in C# 3 ist. Der OP hat nicht klar unterschieden, ob er C# 3 oder C# 2 verwendet, also ist es schwer zu sagen, was er will. –

0

Ich ziehe wie diese

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))]; 
     } 
Verwandte Themen