IEnumerable上的FindLast

时间:2009-01-12 15:20:58

标签: c# ienumerable ilist

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

5 个答案:

答案 0 :(得分:8)

相当于:

var last = list.FindLast(predicate);

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

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

实际上“Where()”是Find部分,“Last()”分别是“FindLast”的Last部分。同样,FindFirst(predicate)将映射到sequence.Where(predicate).FirstOrDefault()FindAll(predicate)将映射为sequence.Where(predicate)

答案 1 :(得分:4)

LINQ-to-Objects如何:

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;
    }
}

答案 2 :(得分:1)

您可以通过将集合传递给List&lt;&gt;来将您的集合添加到新列表中构造

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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