2013-01-23 28 views
8

Tôi có danh sách các mục chứa {10, 11, 23, 34, 56, 43} và tôi muốn tìm các chỉ mục của tất cả các mục lớn hơn 23. Các giá trị này có thể là bất kỳ thứ tự nào vì vậy tôi không muốn sắp xếp chúng.Làm cách nào để tìm thấy các chỉ mục của các mục đáp ứng một số điều kiện trong Danh sách int?

List<int> mylist = new List<int> { 10, 11, 23, 34, 56, 43 }; 

Tôi quan tâm đến các chỉ mục của tất cả các mục đang hoàn thành điều kiện và không chỉ mục đầu tiên đáp ứng điều kiện. vì vậy dòng mã này không hoạt động đối với tôi.

int index = mylist.FindIndex(x => x > 23); 

Trả lời

15
var indexes = mylist.Select((v, i) => new { v, i }) 
        .Where(x => x.v > 23) 
        .Select(x => x.i); 
+0

Để có được các chỉ số đầu tiên của như xảy ra: '_list.Select ((v, i) => mới {v, i}). Ở đâu (x => xvPriority> activity.Priority) .Chọn (x => xi). Đầu tiên(); ' – gregsdennis

+2

@gregsdennis' _list.Select ((v, i) => new { v, i}). Đầu tiên (x => xvPriority> activity.Priority) .i; ' –

+1

@EdwinStoteler, được rồi. :) – gregsdennis

1

LINQ không cung cấp một điều như vậy trực tiếp, nhưng bạn có thể viết riêng bạn. Một cái gì đó như thế này:

public static IEnumerable<int> FindIndices<T>(this IEnumerable<T> items, Func<T, bool> predicate) 
{ 
    int i = 0; 

    foreach (var item in items) 
    { 
     if (predicate(item)) 
     { 
      yield return i; 
     } 

     i++; 
    } 
} 

Sau đó, một cái gì đó như:

foreach (int index in mylist.FindIndices(x => x > 23)) 
    ... 

(.! Điều này có lợi thế là có hiệu quả hơn các phương pháp khác được liệt kê ở trên này chỉ có ý nghĩa đối với chuỗi LỚN dù)

+0

Phương thức này trả về một giá trị duy nhất – User1551892

+0

Cảm ơn, tôi đã sửa lỗi đánh máy trong kiểu trả về. –

0

phương pháp Phần mở rộng này không được công việc, nice and clean:

public static class ListExtensions 
{ 
    /// <summary> 
    /// Finds the indices of all objects matching the given predicate. 
    /// </summary> 
    /// <typeparam name="T">The type of objects in the list.</typeparam> 
    /// <param name="list">The list.</param> 
    /// <param name="predicate">The predicate.</param> 
    /// <returns>Indices of all objects matching the given predicate.</returns> 
    public static IEnumerable<int> FindIndices<T>(this IList<T> list, Func<T, bool> predicate) 
    { 
     return list.Where(predicate).Select(list.IndexOf); 
    } 
} 

Kiểm tra các working demo

0

Một biến thể nhỏ để rgripper'sanswer,

List<int> mylist = new List<int> { 10, 11, 23, 34, 56, 43 }; 
List<int> newList = mylist.Select((v, i) => new { v, i }) 
         .Where(x => x.v > 23) 
         .Select(x => x.i).ToList<int>(); 

DEMO

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