2013-08-01 34 views

Trả lời

277

Làm thế nào về List.FindIndex Method:

int index = myList.FindIndex(a => a.Prop == oProp); 

Phương pháp này thực hiện tìm kiếm tuyến tính; do đó, phương pháp này là một hoạt động O (n), trong đó n là Đếm.

+0

Tác phẩm này không hoạt động nhưng không phải LINQ, tuy nhiên +1 –

+2

Còn 'int index' thì sao? –

+1

@DylanChensky anh ấy đang viết mã JS quá nhiều – lenny

57

EDIT: Nếu bạn chỉ sử dụng một List<> và bạn chỉ cần chỉ mục, sau đó List.FindIndex thực sự là cách tiếp cận tốt nhất. Tôi sẽ để lại câu trả lời này ở đây cho những người cần bất kỳ điều gì khác biệt (ví dụ: trên đầu trang của bất kỳ IEnumerable<>) nào.

Sử dụng sự quá tải của Select mà phải mất một chỉ mục trong các vị, vì vậy bạn chuyển đổi danh sách của bạn thành một (chỉ số, giá trị) cặp:

var pair = myList.Select((Value, Index) => new { Value, Index }) 
       .Single(p => p.Value.Prop == oProp); 

Sau đó:

Console.WriteLine("Index:{0}; Value: {1}", pair.Index, pair.Value); 

Hoặc nếu bạn chỉ muốn chỉ mục và bạn đang sử dụng nó ở nhiều nơi, bạn có thể dễ dàng viết phương thức mở rộng của riêng mình giống như Where, nhưng thay vì trả lại các mục gốc, nó sẽ trả về chỉ mục của các mục đó các mục khớp với vị từ.

+0

Dường như tất cả những gì anh ta muốn là chỉ mục. Danh sách <>. FindIndex (Predicate <>) là cách tiếp cận tốt nhất. Mặc dù tiêu đề câu hỏi sẽ làm nổi bật khác, mô tả của OP khá rõ ràng, anh chỉ cần chỉ mục "int theThingIActuallyAmInterestedIn" –

+1

@LastCoder: Aha - đã bỏ qua FindIndex. Vâng, tôi hoàn toàn đồng ý. –

+0

Chỉ cần được rõ ràng, là "chỉ số/giá trị -> duy nhất" cách tiếp cận "tốt hơn" (ở đây có nghĩa là được nhanh hơn về Big-O) hơn bằng tay lặp lại hai lần? Hoặc là nhà cung cấp LINQ2Objects đủ thông minh để tối ưu hóa một trong các lần lặp lại? (Tôi giả định rằng cả Select và Single nói chung là O (n) hoạt động) – kai

11

Nếu bạn không muốn sử dụng LINQ, sau đó:

int index; 
for (int i = 0; i < myList.Count; i++) 
{ 
    if (myList[i].Prop == oProp) 
    { 
     index = i; 
     break; 
    } 
} 

cách này bạn đang lặp lại danh sách chỉ một lần.

+1

đây không phải là linq –

+14

@KingKing noone đã nói. –

+1

Đây có phải là triển khai giống như Linq 'FindIndex' không quan tâm? – Coops

53

Đối với các loại đơn giản, bạn có thể sử dụng "IndexOf":

List<string> arr = new List<string>(); 
arr.Add("aaa"); 
arr.Add("bbb"); 
arr.Add("ccc"); 
int i = arr.IndexOf("bbb"); // RETURNS 1. 
+2

Cảm ơn! Thật đơn giản ... – Teiki

+1

Tính năng này đang hoạt động. – Ammar

3
  1. giải pháp đơn giản để tìm chỉ số cho bất kỳ giá trị chuỗi trong danh sách.

Dưới đây là mã cho List Of String:

int indexOfValue = myList.FindIndex(a => a.Contains("//insert value from list")); 
  1. giải pháp đơn giản để tìm chỉ số cho bất kỳ giá trị Integer trong danh sách.

Đây là Mã cho List Of Integer:

int indexOfNumber = myList.IndexOf(//insert number from list); 
0

Dưới đây là một sao chép/dán phương pháp khuyến nông-thể cho IEnumerable

public static class EnumerableExtensions 
{ 
    /// <summary> 
    /// Searches for an element that matches the conditions defined by the specified predicate, 
    /// and returns the zero-based index of the first occurrence within the entire <see cref="IEnumerable{T}"/>. 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <param name="list">The list.</param> 
    /// <param name="predicate">The predicate.</param> 
    /// <returns> 
    /// The zero-based index of the first occurrence of an element that matches the conditions defined by <paramref name="predicate"/>, if found; otherwise it'll throw. 
    /// </returns> 
    public static int FindIndex<T>(this IEnumerable<T> list, Func<T, bool> predicate) 
    { 
     var idx = list.Select((value, index) => new {value, index}).Where(x => predicate(x.value)).Select(x => x.index).First(); 
     return idx; 
    } 
} 

Thưởng thức.

Các vấn đề liên quan