Как переопределить оператор выбора Linq? - PullRequest
2 голосов
/ 28 января 2020

Мне нужна поточная реализация списка, поэтому я создал переопределение для всех функций списка и реализовал все (полезные) функции Linq и окружил их блокировкой. Единственная функция Linq, которую мне не удалось реализовать, - это Select.

Так выглядит функция Select в реализации Linq

public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);

Я пытаюсь это переопределить. Видно, что select требует использования T и TResult, но для переопределения реализации списка у меня есть только T. Это то, что я пробовал до сих пор:

    public partial class ThreadSafeList<T> : List<T>
    {
        public object _lock = new object();      

        public IEnumerable<TResult> Select(Func<T, TResult> selector)
        {
            lock (_lock)
            {
                return System.Linq.Enumerable.Select(this, selector);
            }
        }
    }

Но TResult не существует. Любые идеи о том, как я могу переопределить реализацию Linq Select?

1 Ответ

4 голосов
/ 28 января 2020

Вы также должны сделать свой Select метод generi c, добавив TResult generi c аргумент типа

public IEnumerable<TResult> Select<TResult>(Func<T, TResult> selector)
{
    lock (_lock)
    {
        return System.Linq.Enumerable.Select(this, selector);
    }
}

Но имейте в виду, что Select метод на самом деле является методом расширения. System.Linq также использует отложенное выполнение, вы можете оценить результат в список, используя метод ToList(), прежде чем возвращать его, например

using System.Linq;
...
public IEnumerable<TResult> Select<TResult>(Func<T, TResult> selector)
{
    lock (_lock)
    {
        return Enumerable.Select(this, selector).ToList();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...