为什么不将IEnumerable枚举为string.Join

时间:2019-06-19 13:06:42

标签: c#

给出了以下运行方法:

internal static void DefaultShow(object o) {
    if ( o is IEnumerable) {
        StringBuilder sb = new StringBuilder(1024);
        foreach(var i in o as IEnumerable ) {
            sb.Append($"{i}|");
        }
        Console.WriteLine(sb.ToString());
    } else {
        Console.WriteLine(o.ToString());
    }
}

DefaultShow("a,b,c".Split(","));

显示:

  

“ a | b | c |”

何时:

internal static void DefaultShow(object o) {
    if ( o is IEnumerable) {
        Console.WriteLine(string.Join("|", o as IEnumerable));
    } else {
        Console.WriteLine(o.ToString());
    }
}

DefaultShow("a,b,c".Split(","));

显示:

  

System.String []

5 个答案:

答案 0 :(得分:2)

如果您查看string.Join中的list of overloads,则他们都不接受IEnumerable。有一个接受IEnumerable<string>的人,就是这样。

因此,您对string.Join的调用将绑定到需要params object[]的重载。从方法的角度来看,object[]仅具有一个元素,即IEnumerable,因此它对此调用ToString()并返回。

您可能想先将IEnumerable强制转换为IEnumerable<object>,然后通过ToString将所有内容转换为字符串:

internal static void DefaultShow(object o) {
    if ( o is IEnumerable) {
        Console.WriteLine(string.Join("|", (o as IEnumerable).Cast<object>().Select(x => x.ToString())));
    } else {
        Console.WriteLine(o.ToString());
    }
}

答案 1 :(得分:0)

检查使用哪种方法

enter image description here

(由于IEnumerable而将o视为对象数组的一项)(因为有参数),而您需要的方法期望使用IEnumerable

更新:顺便说一句,我不知道为什么Visual Studio向我显示第一个参数为char类型-它应该是字符串,似乎是VS的问题))

答案 2 :(得分:0)

因为string.Join("|", o as IEnumerable)将使用此重载:

public static string Join(string separator, params object[] values)

没有将IEnumerable作为参数的重载。仅通用版本(IEnumerable<T>)有重载。

答案 3 :(得分:0)

Console.WriteLine(o)将在内部调用o.ToString(),并且由于变量o是一个字符串数组,因此将显示System.String []。

答案 4 :(得分:0)

发生这种情况是因为您以IEnumerable的身份加入。因此,要显示所有项目,应将其投射到IEnumerable<string>

if (o is IEnumerable<string>)
{             
    Console.WriteLine(string.Join("|", (o as IEnumerable<string>)));             
}
else
{
     Console.WriteLine(o.ToString());
}