C# IEnumerable上的FindLast

C# IEnumerable上的FindLast,c#,ienumerable,ilist,C#,Ienumerable,Ilist,我想对实现了IEnumerable的集合调用FindLast,但FindLast仅适用于List。最好的解决方案是什么?使用扩展方法Last() 它位于命名空间System.Linq中。通过将集合传递给列表构造函数,可以将集合添加到新列表中 List<MyClass> myList = new List<MyClass>(MyCol); myList.FindLast.... List myList=新列表(mycl); 我的列表。最后一个。。。。 相当于: var l

我想对实现了
IEnumerable
的集合调用
FindLast
,但
FindLast
仅适用于
List
。最好的解决方案是什么?

使用扩展方法Last()
它位于命名空间System.Linq中。

通过将集合传递给列表构造函数,可以将集合添加到新列表中

List<MyClass> myList = new List<MyClass>(MyCol);
myList.FindLast....
List myList=新列表(mycl);
我的列表。最后一个。。。。
相当于:

var last = list.FindLast(predicate);

(但是,后者必须检查序列中的所有项目…)


实际上,“Where()”是Find部分,“Last()”分别是“FindLast”的最后一部分。类似地,
FindFirst(谓词)
将映射到
序列。Where(谓词)。FirstOrDefault()
FindAll(谓词)
将映射到
序列。Where(谓词)

使用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;
    }
}
使用系统;
使用System.Collections.Generic;
静态类程序{
静态void Main(){
int[]数据={1,2,3,4,5,6};
int lastOdd=SequenceUtil.Last(
数据,委托(inti){return(i%2)==1;});
}    
}
静态类SequenceUtil{
公共静态T Last(IEnumerable数据,谓词){
T last=默认值(T);
foreach(数据中的T项){
if(谓词(项))last=项;
}
最后返回;
}
}

您的问题无效,因为集合没有最后一个元素。一个具有完整排序的更专门的集合是列表。没有排序的更专门的集合是字典

也许是最上面的部分,但我认为2.0的东西可能有用,所以我把它分开了。啊,只看到了v1!我甚至没有想到你会像你一样花时间去扩展它。。。顺便说一句,对于所有这些Util类型的东西,当我被限制在2.0时,PowerCollections曾经是我的重锤——algorithms.cs是一本很棒的读物。打赌它的Last()可以选择收藏!根据比较方法、列表长度和匹配频率的不同,使用以下命令可能会提高CPU效率:sequence.Reverse.Where(谓词).FirstOrDefault();然而,内存效率不是很高。
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;
    }
}