代码之家  ›  专栏  ›  技术社区  ›  AngryHacker

如何将这段代码转换为泛型?

  •  3
  • AngryHacker  · 技术社区  · 15 年前

    我有以下扩展方法,它获取一个列表并将其转换为逗号分隔的字符串:

        static public string ToCsv(this List<string> lst)
        {
            const string SEPARATOR = ", ";
            string csv = string.Empty;
    
            foreach (var item in lst)
                csv += item + SEPARATOR;
    
            // remove the trailing separator
            if (csv.Length > 0)
                csv = csv.Remove(csv.Length - SEPARATOR.Length);
    
            return csv;
        }
    

    我想做一些类似的事情,但是将它应用到一个列表(而不是字符串列表),但是编译器不能解析为t:

        static public string ToCsv(this List<T> lst)
        {
            const string SEPARATOR = ", ";
            string csv = string.Empty;
    
            foreach (var item in lst)
                csv += item.ToString() + SEPARATOR;
    
            // remove the trailing separator
            if (csv.Length > 0)
                csv = csv.Remove(csv.Length - SEPARATOR.Length);
    
            return csv;
        }
    

    我错过了什么?

    4 回复  |  直到 15 年前
        1
  •  8
  •   jason    15 年前

    首先,方法声明应该是:

    public static string ToCsv<T>(this List<T> list) { // }
    

    请注意,该方法必须参数化;这是 <T> 方法名称之后。

    第二,不要重新发明轮子。只使用 String.Join :

    public static string ToCsv<T>(this IEnumerable<T> source, string separator) {
        return String.Join(separator, source.Select(x => x.ToString()).ToArray());
    }
    
    public static string ToCsv<T>(this IEnumerable<T> source) {
        return source.ToCsv(", ");
    }
    

    请注意,我已经疯了,并通过接受 IEnumerable<T> 而不是 List<T> .

    在.NET 4.0中,您可以说:

    public static string ToCsv<T>(this IEnumerable<T> source, string separator) {
        return String.Join(separator, source.Select(x => x.ToString());
    }
    
    public static string ToCsv<T>(this IEnumerable<T> source) {
        return source.ToCsv(", ");
    }
    

    也就是说,我们不需要转换 source.Select(x => x.ToString()) 一个数组。

    最后,有关此主题的有趣博客文章,请参阅Eric Lippert的文章。 Comma Quibbling .

        2
  •  7
  •   cwap    15 年前

    尝试将声明更改为

    static public string ToCsv<T>(this List<T> lst){ ...
    
        3
  •  3
  •   itowlson    15 年前

    您的函数需要一个通用参数:

    static public string ToCsv<T>(this List<T> lst)
                              ^^^
    
        4
  •  2
  •   Muad'Dib    15 年前

    您可以使其更通用,并使用IEnumerable而不是列表<t>,毕竟您没有使用任何特定于列表的方法

    public static string ToCsv<T>(this IEnumerable lst);