1. ホーム
  2. c#

[解決済み] 汎用拡張メソッドを作成するには?

2023-08-18 21:40:15

質問

文字列をアルファベット順、長さ昇順の順に並べる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はLengthの定義を含んでいません。

エラー2: System.Linq.IOrderedEnumerableT[] .

どのように解決するのですか?

最初のエラーは Length のプロパティが String クラスのプロパティであるのに対し、あなたの汎用バージョンでは T パラメータの型は知られていません。それは任意の型である可能性があります。

2つ目のエラーは、クエリオブジェクトだけを返して、実際の結果を返さないためです。そのため 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);