Возрастающий Поиск - Ctrl + я
Это - в основном диалоговое окно находки без диалогового окна. Только начните вводить то, что Вы хотите искать (посмотрите на нижнее местоположение строки состояния для наблюдения то, что Вы ввели). При нажатии Ctrl + я снова или F3 ищем следующий экземпляр. Нажмите Escape для выхода. При запуске нового поиска путем нажатия Ctrl + я дважды повторяю последний поиск.
Первая ошибка связана с тем, что 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);
Почему вы хотите сделать это в общем? Просто используйте
public static class ExtensionOperations
{
public static IEnumerable<string> AlphaLengthWise(this string[] names)
{
var query = names.OrderBy(a => a.Length).ThenBy(a => a);
return query;
}
}
Я думаю, вы можете немного запутаться в назначении универсальных шаблонов.
Универсальные шаблоны - это способ приспособить класс или метод к определенному типу. Универсальный метод или класс разработан для работы с любым типом . Это проще всего проиллюстрировать в классе 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
и многие другие.
Почему вы хотите, чтобы это было generic?
Это будет работать только тогда, когда T
имеет свойство Length, и вам понадобится интерфейс для обеспечения этого.
Кроме того, T должен быть IComparable.
Я хочу разработать универсальный метод расширения, который должен упорядочить строки в алфавитном порядке, а затем ...
public static class ExtensionOperation
{
public static IEnumerable<String> AplhaLengthWise(
this IEnumerable<String> names)
{
return names.OrderBy(a => a.Length).ThenBy(a => a);
}
}
Скопируйте, как это делает 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);
}
}
Вы хотите использовать IEnumerable
вместо T []
. Кроме этого, вы не сможете использовать Length
из T
, поскольку не все типы имеют свойство Length
. Вы можете изменить свой метод расширения на .OrderBy (a => a.ToString (). Length)
Если вы знаете, что всегда будете иметь дело со строками, используйте IEnumerable
вместо IEnumerable
, и вы сразу же получите доступ к свойству Length
.