2009-10-14 12 views
41

IndexOf() yönteminin List<T> yöntemini kullanarak gördüğüm tüm örnekler temel dize türleridir. Ne bilmek istediğim, nesne değişkenlerinden birine dayanan bir nesne türü listesi dizininin nasıl döndürüleceğidir.Listenin IndexOf() yöntemi Listenin kullanımı <object>

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

Ben endeksi bulmak istediğiniz yere employeeList.LastName == "Something"

+0

gibi tercih? .net 2.0 – omencat

+0

Kullanarak Sıkıştım Çözümümümü aşağıda kullanabilir misiniz? –

cevap

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

Düzenleme: C# 2.0 için lambdas (orijinal LINQ veya sadece lambda sözdizimi herhangi .NET 3+ özellikleri kullanmaz olmadan C# 3.0):

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

Bunun doğru olduğunu onaylıyorum. Ancak proje Linq kullanmıyor. .NET 2.0 – omencat

+1

@Bay'i kullanıyoruz: anonim temsilciler için eski (pre-C# 3) sözdizimini kullanabilirsiniz, ancak yazdığım orijinal C# 3 ile derlediğiniz sürece .NET 2'de çalışacaktır. derleyici (C# 3.0 ve .NET 3.0 birbirine bağımlı değildir). –

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

kullanma lambda'lar:

01 Tam Örnek: -
employeeList.FindIndex(r => r.LastName.Equals("Something")); 

Not:

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

Eğer geçersiz kılma aracılığıyla yapabiliriz

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

Çirkin bir çözüm ... – Kamarey

+1

Bu fisrt dotnet sürüm –

+5

içinde yaptığımız budur. Bu aslında asıl soruyu yanıtlayan tek yanıttır - IndexOf() 'herhangi bir nesne ile nasıl kullanılır. Diğer herkes sadece 'FindIndex()' kullanarak yerine önerdi ... ki bu da sorun değil, ama bu cevap bence daha fazla kredi almalı. – codeulike

4

Maalesef yöntemini, iyi bir tedbir :)

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

Düzenleme için daha Eşittir .NET 2.0 Projesinde.

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

Evet, bu benim gerçek isteğimi yerine getirir. Diğer kullanıcılar için lambda sürümündeki onay işaretini 3,5 kullanıyormuş gibi bırakıyorum. Teşekkürler. – omencat

+0

Cool, işe yaradığı için memnun oldum. –

+0

Örneğiniz, yalnızca C# 3 olan başlatıcı sözdizimini kullanır. OP, C# 3 veya C# 2 kullanıp kullanmadığını açıkça ayırt etmemiştir, bu yüzden ne istediğini söylemek zor. –

0

Ben lambda ifadeleri olmadan bunu yapmanın bir yolu var mı bu

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