2009-01-12 25 views

回答

8

相當於:

var last = list.FindLast(predicate); 

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

(後者則要檢查序列中所有項目,但是......)

有效地,「Where()」是查找部分,「Last()」是「FindLast的最後部分」 「 分別。同樣,FindFirst(predicate)將映射到sequence.Where(predicate).FirstOrDefault()FindAll(predicate)將是sequence.Where(predicate)

+0

根據比較方法,列表的長度和匹配的頻率,它可能更有效率地處理CPU: sequence.Reverse.Where(predicate).FirstOrDefault(); 但是內存效率不高。 – mancaus 2009-01-12 16:51:41

0

使用位於命名空間System.Linq中的擴展方法Last() 。

+0

這並不適用謂詞... – 2009-01-12 15:58:21

1

您可以將集合添加到新列表,方法是將它傳遞給列表<>構造函數。

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

如何使用LINQ到對象:

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

如果你只有C#2,您可以使用一個工具方法來代替:

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

我們能不能把它編輯成雙向飛鏢的答案? – 2009-01-12 15:52:03

0

你的問題是無效的,因爲集合了沒有最後的元素。具有完整排序的更專業的集合是一個列表。沒有排序的更專業的集合是字典。