IT박스

일반 확장 메서드를 만드는 방법은 무엇입니까?

itboxs 2020. 11. 24. 07:48
반응형

일반 확장 메서드를 만드는 방법은 무엇입니까?


문자열을 알파벳순으로 정렬 한 다음 길이 오름차순으로 정렬해야하는 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.IOrderedEnumerableT[].


첫 번째 오류는 일반 버전에서는 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 Thas 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

반응형