Как создать универсальный дополнительный метод?

Возрастающий Поиск - Ctrl + я

Это - в основном диалоговое окно находки без диалогового окна. Только начните вводить то, что Вы хотите искать (посмотрите на нижнее местоположение строки состояния для наблюдения то, что Вы ввели). При нажатии Ctrl + я снова или F3 ищем следующий экземпляр. Нажмите Escape для выхода. При запуске нового поиска путем нажатия Ctrl + я дважды повторяю последний поиск.

63
задан BartoszKP 21 February 2015 в 22:11
поделиться

7 ответов

Первая ошибка связана с тем, что Length является свойством класса String , тогда как в вашей универсальной версии это тип параметра T. не известно. Это может быть любой тип.

Вторая ошибка связана с тем, что вы возвращаете только объект запроса, но не фактический результат. Возможно, вам потребуется вызвать ToArray () перед возвратом.

С небольшими изменениями вы можете придумать следующее:

public static class ExtensionOperation
{
    public static IEnumerable<T> AlphaLengthWise<T, L>(
        this IEnumerable<T> names, Func<T, L> lengthProvider)
    {
        return names
            .OrderBy(a => lengthProvider(a))
            .ThenBy(a => a);
    }
}

Что вы можете использовать следующим образом:

string[] names = { "Jon", "Marc", "Joel", "Thomas", "Copsey", "Konrad", "Andrew", "Brian", "Bill" };
var result = names.AlphaLengthWise(a => a.Length);
96
ответ дан 24 November 2019 в 16:19
поделиться

Почему вы хотите сделать это в общем? Просто используйте

public static class ExtensionOperations
{
    public static IEnumerable<string> AlphaLengthWise(this string[] names)
    {
        var query = names.OrderBy(a => a.Length).ThenBy(a => a);
        return query;
    }
}
14
ответ дан 24 November 2019 в 16:19
поделиться

Я думаю, вы можете немного запутаться в назначении универсальных шаблонов.

Универсальные шаблоны - это способ приспособить класс или метод к определенному типу. Универсальный метод или класс разработан для работы с любым типом . Это проще всего проиллюстрировать в классе List , где он может быть настроен как список любого типа. Это дает вам безопасность типов, зная, что список содержит только этот конкретный тип.

Ваша проблема предназначена для работы с определенным типом, типом string . Обобщения не решат проблемы, связанные с конкретным типом.

Вам нужен простой (не общий) метод расширения:

public static class ExtensionOperations
{
    public static IEnumerable<string> AlphaLengthWise(
        this IEnumerable<string> names)
    {
        if(names == null)
            throw new ArgumentNullException("names");

        return names.OrderBy(a => a.Length).ThenBy(a => a);
    }
}

Создание аргумента и возвращаемого типа IEnumerable делает этот метод расширения неуниверсальным, который может применяться к любому типу, реализующему IEnumerable . Это будет включать строку [] , List , ICollection , IQueryable и многие другие.

7
ответ дан 24 November 2019 в 16:19
поделиться

Почему вы хотите, чтобы это было generic?

Это будет работать только тогда, когда T имеет свойство Length, и вам понадобится интерфейс для обеспечения этого.

Кроме того, T должен быть IComparable.

4
ответ дан 24 November 2019 в 16:19
поделиться

Я хочу разработать универсальный метод расширения, который должен упорядочить строки в алфавитном порядке, а затем ...

public static class ExtensionOperation
{
    public static IEnumerable<String> AplhaLengthWise(
                                   this IEnumerable<String> names)
    {
        return names.OrderBy(a => a.Length).ThenBy(a => a);
    }
}
2
ответ дан 24 November 2019 в 16:19
поделиться

Скопируйте, как это делает Microsoft:

public static class ExtensionOperation {
    // Handles anything queryable.
    public static IOrderedQueryable<string> AlphaLengthWise(this IQueryable<string> names) {
        return names.OrderBy(a => a.Length).ThenBy(a => a);
    }
    // Fallback method for non-queryable collections.
    public static IOrderedEnumerable<string> AlphaLengthWise(this IEnumerable<string> names) {
        return names.OrderBy(a => a.Length).ThenBy(a => a);
    }
}
1
ответ дан 24 November 2019 в 16:19
поделиться

Вы хотите использовать IEnumerable вместо T [] . Кроме этого, вы не сможете использовать Length из T , поскольку не все типы имеют свойство Length . Вы можете изменить свой метод расширения на .OrderBy (a => a.ToString (). Length)

Если вы знаете, что всегда будете иметь дело со строками, используйте IEnumerable вместо IEnumerable , и вы сразу же получите доступ к свойству Length .

0
ответ дан 24 November 2019 в 16:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: