1

コンマリストを T の配列に変換するために書いたスニペットを次に示します。

public static T[] ToArray<T>(this string s, params char[] seps)
{
    if (typeof(T) == typeof(int))
    {
        return s.Split(seps.Length > 0 ? seps : new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                    .Select(id => int.Parse(id))
                    .Cast<T>()
                    .ToArray();
    }
    else throw new Exception("cannot convert to " + typeof(T).Name);
}

サポートしたいタイプごとにケースを配置する必要があります。

この種のものをコーディングするより良い方法はありますか?

4

3 に答える 3

4

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

public static T[] ToArray<T>(this string s, Func<string, T> converter, params char[] seps)
{
    return s.Split(seps.Length > 0 ? seps : new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(converter)
            .ToArray();
}

次のように呼び出すことができます:

"1,2,3".ToArray(int.Parse, ',', ';');

.Parse は少し醜いことに同意しますが、必要なデータ型の柔軟性が得られます...

于 2012-08-21T00:44:30.370 に答える
2

に制約Tする場合は、 ToTypeIConvertibleを使用できます。

public static T[] ToArray<T>(this string s, params char[] seps)
   where T : IConvertible
{
    Type targetType = typeof(T);
    return s.Split(seps.Length > 0 ? seps : new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                    .Cast<IConvertible>()
                    .Select(ic => ic.ToType(targetType, CultureInfo.InvariantCulture))
                    .Cast<T>()
                    .ToArray();
}
于 2012-08-21T00:45:45.080 に答える
0

あなたは試すかもしれません:

public static T[] ToArray<T>(this string s, Func<string, T> convert, char[] seps)
{
  char[] separators = seps != null && seps.Length > 0 ? seps : new[] { ',' };
  T[]    values     = s.Split(separators, StringSplitOptions.RemoveEmptyEntries)
                       .Select(x => convert(x))
                       .ToArray()
                       ;
  return values;
}

デリゲートを渡して変換を行うだけです。

int[] Xs = "1,2,3".ToArray<int>(int.Parse , ',' , '-' , '/' , '|');
于 2012-08-21T00:52:13.597 に答える