FindLast на IEnumerable - PullRequest
       31

FindLast на IEnumerable

5 голосов
/ 12 января 2009

Я хотел бы вызвать FindLast для коллекции, которая реализует IEnumerable, но FindLast доступна только для List. Какое лучшее решение?

Ответы [ 5 ]

8 голосов
/ 12 января 2009

Эквивалент:

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).

4 голосов
/ 12 января 2009

Как насчет 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;
    }
}
1 голос
/ 12 января 2009

вы можете добавить свою коллекцию в новый список, передав ее конструктору List <>.

List<MyClass> myList = new List<MyClass>(MyCol);
myList.FindLast....
0 голосов
/ 12 января 2009

Ваш вопрос недействителен, так как в коллекции нет последнего элемента. Более специализированная коллекция с полным упорядочением - это список. Более специализированная коллекция, в которой нет порядка, - это словарь.

0 голосов
/ 12 января 2009

Используйте метод расширения Last () который находится в пространстве имен System.Linq.

...