2009-10-14 18 views
41

Wszystkie przykłady, które widzę podczas korzystania z metody IndexOf() w List<T>, mają podstawowe typy ciągów. Chcę wiedzieć, jak zwrócić indeks typu listy, który jest obiektem, na podstawie jednej ze zmiennych obiektu.Sposób korzystania z metody IndexOf() z listy <object>

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

Chcę znaleźć indeks gdzie employeeList.LastName == "Something"

+0

Czy istnieje sposób to zrobić bez wyrażeń lambda? Utknąłem przy użyciu .net 2.0 – omencat

+0

Czy możesz użyć mojego rozwiązania poniżej? –

Odpowiedz

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

Edit: Bez lambdas dla C# 2.0 (oryginał nie używać LINQ lub jakiejkolwiek .NET 3+ możliwości, tylko w składni lambda C# 3.0):

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

Potwierdzam, że wykonuje to zadanie. Jednak projekt nie używa Linq. Używamy .NET 2.0 – omencat

+1

@Bay: możesz używać starej składni (pre-C# 3) dla anonimowych delegatów, ale oryginał, który napisałem, będzie działał w .NET 2, dopóki kompilujesz z C# 3 kompilator (C# 3.0 i .NET 3.0 nie są od siebie zależne). –

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

Korzystanie lambdas:

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

Uwaga:

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

można to zrobić za pomocą ręcznego Równa metoda

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

Brzydkie rozwiązanie ... – Kamarey

+1

To jest to, co robiliśmy w fisrt dotnet wersji –

+5

Jest to w rzeczywistości jedyna odpowiedź, która odpowiada na oryginalne pytanie - jak używać 'IndexOf()' z dowolnym obiektem. Wszyscy inni właśnie zasugerowali użycie 'FindIndex()' zamiast ... co jest w porządku, ale ta odpowiedź powinna być większa. – codeulike

4

Niestety, jeszcze jeden środek na dobre :)

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

EDIT: - Pełny Przykład w projekcie .NET 2.0.

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

Tak, to spełnia moje aktualne żądanie. Zostawiam znak wyboru w wersji lambda dla innych użytkowników, ponieważ mogą używać 3.5. Dzięki. – omencat

+0

Fajnie, cieszę się, że działa. –

+0

Twój przykład wykorzystuje składnię inicjalizacyjną, która jest tylko w języku C# 3. OP nie ma wyraźnego rozróżnienia, czy używa C# 3 czy C# 2, więc trudno powiedzieć, czego chce. –

0

Wolę jak to

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))]; 
     } 
Powiązane problemy