使用String.Join的IEnumerable扩展方法返回System.Collections.Generic.List`1 [System.String]

时间:2017-09-28 09:34:06

标签: c# string ienumerable extension-methods

我很惊讶list.Join()返回System.Collections.Generic.List`1[System.String]

static void Main(string[] args)
{
    var list = new List<string>();

    list.Add("1024");
    list.Add("2048");

    Console.WriteLine(list.Join());

    Console.WriteLine(string.Join(", ", list));

    Console.ReadKey();
}

使用扩展方法

public static class StringExtensions
{
    public static string Join(this IEnumerable list)
    {
        return string.Join(", ", list);
    }
}

我不明白它不会返回我期望的内容,因为我认为我非常熟悉string.join和扩展方法

我在内心思考它会是这样的

static string Join(IEnumerable list)
{
    StringBuilder sb = new StringBuilder();

    foreach (var item in list)
    {
        sb.Append(item).Append(", ");
    }

    return sb.ToString();
}

最后,我使用此版本来支持通用和非通用版本。

public static string Join(this IEnumerable list)
{
    return Join(list.Cast<object>());
}

public static string Join<T>(this IEnumerable<T> list)
{
    return string.Join(",", list);
}

1 个答案:

答案 0 :(得分:5)

原因是:扩展方法将通用List<string> / IEnumerable<string>转换为非通用IEnumerable

因此,您将在此处使用单个对象调用this params overload of string.Join

public static string Join(this IEnumerable list)
{
    return string.Join(", ", list);
}

由于对象是List<string>而未覆盖ToString,因此您将获得结果的类型名称:System.Collections.Generic.List1[System.String]

您可以通过以下方式更改扩展程序:

public static string Join(this IEnumerable list)
{
    return string.Join(", ", list.Cast<object>());
}