9

いくつかの文字で区切られた値を持つ文字列をリストに変換する必要があることがよくあります。文字列を指定された型のリストに変換する汎用拡張メソッドを作成したいと考えています。これが私がこれまでに持っているものです:

    public static List<T> ToDelimitedList<T>(this string value, string delimiter)
    {
        if (value == null)
        {
            return new List<T>();
        }

        var output = value.Split(new string[] { delimiter }, StringSplitOptions.RemoveEmptyEntries);
        return output.Select(x => (T)x).ToList();
    }

しかし、エラーが発生します。

タイプ 'string' をタイプ 'T' に変換できません。

これを行うためのより良い方法はありますか、またはさまざまなタイプのリストや doConvert.ToInt32()などに対して複数の拡張メソッドを作成する必要がありますか?

アップデート

私はこのようなことをしようとしています:

var someStr = "123,4,56,78,100";
List<int> intList = someStr.ToDelimitedList<int>(",");

また

var someStr = "true;false;true;true;false";
List<bool> boolList = someStr.ToDelimitedList<bool>(";");
4

4 に答える 4

17

Convert.ChangeTypeプリミティブおよび多くのフレームワーク タイプで機能します (デフォルトの解析ルールで十分であると仮定します)。

return output.Select(x => (T) Convert.ChangeType(x, typeof(T)))
             .ToList();

これが独自のカスタム型で機能する必要がある場合は、それらを取得してIConvertibleインターフェイスを実装する必要があります。

これは、カスタム変換ルールで動作するほど洗練されていないか、(例外をスローして操作全体を失敗させる以外に) 適切に失敗に対処できるほど堅牢ではないことに注意してください。これのサポートが必要な場合は、TypeConverterまたは変換デリゲートを受け入れるオーバーロードを提供します(mike zの回答のように)。

于 2013-03-18T16:14:24.733 に答える
9

文字列を任意の型に変換する組み込みの方法はありませんT。メソッドは、ある種のデリゲートを取る必要があります。

public static List<T> ToDelimitedList<T>(this string value, string delimiter, Func<string, T> converter)
{
    if (value == null)
    {
        return new List<T>();
    }

    var output = value.Split(new string[] { delimiter }, StringSplitOptions.RemoveEmptyEntries);
    return output.Select(converter).ToList();
}
于 2013-03-18T16:14:59.377 に答える
6

これは LINQ にとって完璧なタスクではありませんか?

次のようなことができます。

"1,2,3,4,5".Split(',').Select(s => Convert.ToInt32(s)).ToList();

状況に応じて汎用 デリゲートを変更できます。Select()

于 2013-03-18T16:13:54.230 に答える
6

String.SplitEnumerable.Select?だけを使用できるようです。

var list = "1,2,3".Split(",").Select(s => int.Parse(s));

ただし、拡張機能を作成する必要がある場合は、これを試してください...

public static List<T> ParseDelimitedList<T>(this string value, string delimiter, Func<string, T> selector)
{
    if (value == null)
    {
        return new List<T>();
    }

    var output = value.Split(new string[] { delimiter }, StringSplitOptions.RemoveEmptyEntries);
    return output.Select(selector).ToList();
}

var list = "1,2,3".ParseDelimitedList(",", s => int.Parse(s));
于 2013-03-18T16:12:05.213 に答える