我想在实现了IEnumerable
接口的集合上调用FindLast
方法,但是FindLast
只适用于List
。有什么最好的解决方案吗?
我想在实现了IEnumerable
接口的集合上调用FindLast
方法,但是FindLast
只适用于List
。有什么最好的解决方案吗?
相当于:
var last = list.FindLast(predicate);
是
var last = sequence.Where(predicate).LastOrDefault();
然而,后者将不得不检查序列中的所有项...
实际上,“Where()”是“Find”的部分,而“Last()”是“FindLast”的部分。同样地,FindFirst(predicate)
将映射到sequence.Where(predicate).FirstOrDefault()
,而FindAll(predicate)
将是sequence.Where(predicate)
。
var item = data.LastOrDefault(x=>x.Whatever == "abc"); // etc
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;
}
}
你可以通过将集合传递给List<>构造函数来将其添加到新列表中。
List<MyClass> myList = new List<MyClass>(MyCol);
myList.FindLast....
您的问题无效,因为集合没有最后一个元素。一个更专门化具有完全排序的集合是列表。一个更专门化不具有排序的集合是字典。