2009-01-12 10 views
5

Tôi muốn gọi FindLast trên bộ sưu tập thực hiện IEnumerable, nhưng FindLast chỉ có sẵn cho List. giải pháp tốt nhất là gì?FindLast trên IEnumerable

Trả lời

8

Tương đương với:

var last = list.FindLast(predicate); 

var last = sequence.Where(predicate).LastOrDefault(); 

(Sau này sẽ phải kiểm tra tất cả các mục trong trình tự, tuy nhiên ...)

Hiệu quả "Where()" là phần Tìm và "Last()" là phần Cuối cùng của "FindLast " tương ứng. Tương tự, FindFirst(predicate) sẽ là bản đồ đến sequence.Where(predicate).FirstOrDefault()FindAll(predicate) sẽ là sequence.Where(predicate).

+0

Tùy thuộc vào phương pháp so sánh, độ dài danh sách và tần suất phù hợp có thể hiệu quả hơn với CPU: sequence.Reverse.Where (predicate) .FirstOrDefault(); Tuy nhiên, không hiệu quả về bộ nhớ. – mancaus

0

Sử dụng phương pháp mở rộng Last() nằm trong không gian tên System.Linq.

+0

Điều đó không áp dụng biến vị ngữ ... –

1

bạn có thể thêm bộ sưu tập của mình vào Danh sách mới bằng cách chuyển đến Danh sách <> hàm tạo.

List<MyClass> myList = new List<MyClass>(MyCol); 
myList.FindLast.... 
4

Làm thế nào về với LINQ-to-Đối tượng:

var item = data.LastOrDefault(x=>x.Whatever == "abc"); // etc 

Nếu bạn chỉ có C# 2, bạn có thể sử dụng một phương pháp hữu ích thay vì:

using System; 
using System.Collections.Generic; 
static class Program { 
    static void Main() { 
     int[] data = { 1, 2, 3, 4, 5, 6 }; 

     int lastOdd = SequenceUtil.Last<int>(
      data, delegate(int i) { return (i % 2) == 1; }); 
    }  
} 
static class SequenceUtil { 
    public static T Last<T>(IEnumerable<T> data, Predicate<T> predicate) { 
     T last = default(T); 
     foreach (T item in data) { 
      if (predicate(item)) last = item; 
     } 
     return last; 
    } 
} 
+0

chúng ta có thể không chỉ chỉnh sửa nó thành câu trả lời của câu trả lời không? –

+0

Các bit hàng đầu, có thể - nhưng tôi nghĩ rằng các công cụ 2.0 có thể hữu ích, vì vậy tôi giữ nó riêng biệt. –

+0

Ah, chỉ thấy v1! Bạn thậm chí không được coi là người đó sẽ đi và đầu tư thời gian để mở rộng ... BTW cho tất cả những thứ Util này, PowerCollections từng là búa của tôi khi tôi bị hạn chế 2.0 - thuật toán .cs là một bài đọc tuyệt vời. Đặt cược nó Cuối cùng() có một lựa chọn cho Bộ sưu tập! –

0

Câu hỏi của bạn không hợp lệ vì một bộ sưu tập có không có phần tử cuối cùng. Một bộ sưu tập chuyên biệt hơn mà có một trật tự hoàn chỉnh là một danh sách. Một bộ sưu tập chuyên biệt hơn mà không có một thứ tự là một từ điển.