일반 확장 메서드를 만드는 방법은 무엇입니까?
문자열을 알파벳순으로 정렬 한 다음 길이 오름차순으로 정렬해야하는 Generic Extension Method를 개발하고 싶습니다.
내말은
string[] names = { "Jon", "Marc", "Joel",
"Thomas", "Copsey","Konrad","Andrew","Brian","Bill"};
var query = names.OrderBy(a => a.Length).ThenBy(a => a);
Generic Extension Method를 개발하는 방법은 무엇입니까?
나는 시도했다 :
public static class ExtensionOperation
{
public static T[] AlphaLengthWise<T>(this T[] names)
{
var query = names.OrderBy(a => a.Length).ThenBy(a => a);
return query;
}
}
나는 받았다 :
오류 1 : T에 길이 정의가 없습니다.
오류 2 : 변환 할 수 없습니다
System.Linq.IOrderedEnumerable
에T[]
.
첫 번째 오류는 일반 버전에서는 T 매개 변수의 유형을 알 수없는 동안 클래스 Length
의 속성 이기 때문 입니다 String
. 모든 유형이 될 수 있습니다.
두 번째 오류는 쿼리 개체 만 반환하고 실제 결과는 반환하지 않기 때문입니다. 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<T>
클래스 에서 가장 쉽게 설명되며 모든 유형의 목록으로 조정될 수 있습니다. 이렇게하면 목록에 특정 유형 만 포함되어 있다는 것을 알 수있는 유형 안전성이 제공됩니다.
문제는 특정 유형, 유형에서 작동하도록 설계되었습니다 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);
}
}
Making the argument and the return type IEnumerable<string>
makes this a non-generic extension method which can apply to any type implementing IEnumerable<string>
. This will include string[]
, List<string>
, ICollection<string>
, IQueryable<string>
and many more.
Why do you want it to be generic?
This will only work when T
has a Length property, and you will need an interface to enforce that.
Furthermore T has to be IComparable.
I want to develop a Generic Extension Method which should arrange the strings in alphabetical then ...
public static class ExtensionOperation
{
public static IEnumerable<String> AplhaLengthWise(
this IEnumerable<String> names)
{
return names.OrderBy(a => a.Length).ThenBy(a => a);
}
}
Copy how Microsoft does it:
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);
}
}
You want to use IEnumerable<T>
instead of T[]
. Other than that, you won't be able to use Length
of T
, since not all types has a Length
property. You could modify your extension method to .OrderBy(a => a.ToString().Length)
If you know you'll always be dealing with strings, use IEnumerable<String>
rather than IEnumerable<T>
, and you'll be able to access the Length
property immediately.
참고URL : https://stackoverflow.com/questions/1825952/how-to-create-a-generic-extension-method
'IT박스' 카테고리의 다른 글
RecyclerView 저장 / 활동 간 상태 복원 (0) | 2020.11.24 |
---|---|
Go 용 Emacs 모드? (0) | 2020.11.24 |
명령 줄에서 내 YAML 파일의 유효성을 검사하려면 어떻게해야합니까? (0) | 2020.11.24 |
ASP.NET 페이지가없는 ResolveUrl (0) | 2020.11.24 |
한 줄의 텍스트를 한 줄로 유지-전체 줄을 줄 바꿈하거나 전혀 줄 바꿈 없음 (0) | 2020.11.24 |