2013-06-23 46 views
11

Trong MyListList<Person> có thể có một Person với thuộc tính Name được đặt thành "ComTruise". Tôi cần chỉ số của số Person trong danh sách đó. Không phải là Person, chỉ là chỉ mục.Lấy chỉ mục của mục trong danh sách cho thuộc tính của nó

Những gì tôi đang làm bây giờ là:

string myName = ComTruise; 
int thatIndex = MyList.SkipWhile(p => p.Name != myName).Count(); 

Làm thế nào tôi có thể làm điều đó tốt hơn hoặc sử dụng phương pháp IndexOf để thực hiện các nhiệm vụ giống nhau không?

+2

Đó là khá nhiều những gì IndexOf làm ... –

+0

là bộ sưu tập riêng MyList của bạn hoặc là nó Danh sách ? –

+0

Xin lỗi, đã sửa lỗi đó. Cú pháp của IndexOf sẽ như thế nào? – Sturm

Trả lời

12

Vì nó là một ObservableCollection, bạn có thể thử này

int index = MyList.IndexOf(MyList.Where(p => p.Name == "ComTruise").FirstOrDefault()); 

Nó sẽ trở lại -1 nếu "ComTruise" không tồn tại trong bộ sưu tập của bạn.

Như đã đề cập trong nhận xét, điều này thực hiện hai tìm kiếm. Bạn có thể tối ưu hóa nó với vòng lặp for.

int index = -1; 
for(int i = 0; i < MyList.Count; i++) 
{ 
    //case insensitive search 
    if(String.Equals(MyList[i].Name, "ComTruise", StringComparison.OrdinalIgnoreCase)) 
    { 
     index = i; 
     break; 
    } 
} 
+0

Vì vậy, trước tiên bạn tìm thấy nó và sau đó tìm kiếm nó một lần nữa? Điều đó khá không hiệu quả. – svick

+0

Bạn nói đúng, nếu danh sách khá lớn, vòng lặp For sẽ tốt hơn. Tôi đã cập nhật câu trả lời của mình. – keyboardP

+0

Tại sao bạn thay đổi so sánh để khớp với trên nền? Ví dụ: tên của "" X-ComTruise "' sẽ khớp với "tìm kiếm phân biệt chữ hoa chữ thường" của bạn. – svick

0
var p = MyList.Where(p => p.Name == myName).FirstOrDefault(); 
int thatIndex = -1; 
if (p != null) 
{ 
    thatIndex = MyList.IndexOf(p); 
} 

if (p != -1) ... 
17

Bạn có thể sử dụng FindIndex

string myName = "ComTruise"; 
int myIndex = MyList.FindIndex(p => p.Name == myName); 

Lưu ý: FindIndex lợi nhuận -1 nếu không có mục phù hợp với các điều kiện xác định bởi vị cung cấp có thể được tìm thấy trong danh sách.

+0

Arg, thật ra nó là một ObservableCollection và không phải là một List, có cái gì đó tương đương không? Tôi nghĩ nó giống nhau trong trường hợp đặc biệt này. – Sturm

+0

Nó hoạt động rất tốt nếu tôi chuyển đổi ObservableCollection của tôi thành một Danh sách với phương thức .ToList(). Cảm ơn bạn! – Sturm

+0

Cracking, chắc chắn sẽ phân loại bạn, nhưng bạn cũng có thể thực hiện nó mà không cần chuyển đổi (một số câu trả lời khác đã thể hiện cách = D). – Chris

6

Nó có thể làm cho tinh thần để viết một phương pháp mở rộng đơn giản mà thực hiện điều này:

public static int FindIndex<T>(
    this IEnumerable<T> collection, Func<T, bool> predicate) 
{ 
    int i = 0; 
    foreach (var item in collection) 
    { 
     if (predicate(item)) 
      return i; 
     i++; 
    } 
    return -1; 
} 
Các vấn đề liên quan