string.Join()in .net 3.5

时间:2011-10-07 13:15:31

标签: c#

我在vs2008中有一个.net 3.5项目,我正在尝试string.Join()使用stringIEnumerable<T> var result = string.Join(" ", Foo()); )编译器似乎不知道这个重载。

这是我试过的代码

Foo()

其中 IEnumerable<string> Foo() { foreach(string s in new []{"1", "2", "3"} ) { yield return s; } }

> Error 2   Argument '2': cannot convert from
> 'System.Collections.Generic.IEnumerable<string>' to 'string[]'

我得到了

Foo().ToArray()

当然,如果我使用IEnumerable<T>它可行,但我想知道为什么过载{{1}}不起作用。

经典视图中的MSDN表示它与vs2008 / .net 3.5兼容

enter image description here

(我在非经典视图中找不到“此页面特定于......”的消息,所以我想我会设置一个屏幕上限。)

6 个答案:

答案 0 :(得分:15)

直到.NET 4才添加string.Join重载接受IEnumerable<T>。它在.Net 3.5中不可用。 MSDN文档中的经典视图完全不正确。

在.NET 3.5中,您需要在ToArray()上调用IEnumerable<string>,以便将其传递到Join方法。

string.Join(" ", Foo().ToArray()); 

供参考,.NET 3.5支持these are the overloads

答案 1 :(得分:7)

底部的版本信息说明了不同的内容:

Version information on MSDN

请注意,您可以在文章底部找到该版本信息,无论选择的视图如何(它可能看起来有点不同)。

您找到的右上角的注释是指您可以在网址中找到的所选资源版本,例如:

  

http://msdn.microsoft.com/en-us/library/dd783876 (VS.90) .aspx

(以粗体突出显示)。通常这会选择框架版本(因为这些版本与VS一起发布),但显然这里的分类似乎存在错误。

我只是把它报告为错误。

答案 2 :(得分:3)

如果您查看“支持的平台”部分,您可以找到:

  

.NET Framework   支持:4

因此,在案例中使用ToArray()和Foo()调用:

Foo().ToArray()

答案 3 :(得分:1)

您正在查看的MDSN页面仅适用于.Net 4及更高版本。这是您应该检查的页面:

http://msdn.microsoft.com/en-us/library/0h8wc12c(v=VS.90).aspx

请注意,它专门列出了.Net Framework 3.5,并且它不包含您的重载。

答案 4 :(得分:0)

经典视图确实提供了link,但它必须是CMS中的错误条目或其他任何内容。如果单击上述链接,您会看到它丢失了它的上下文(左侧的菜单不知道您在哪里,应该在System.String.Join中),并且版本下拉列表也无法识别它。 / p>

normal version有效,并且仅显示.NET 4和.NET 4.5。

  

.NET Framework受以下版本支持:4

     

.NET Framework Client Profile受以下版本支持:4

答案 5 :(得分:0)

对于它的价值,如果你想坚持.Net 2.0或3.5,并避免在String.Join()的第二个参数上写“.ToArray()”,这里是一个简单的实现,应该模仿.Net 4.0中实现的String.Join()。

   public static class MString
   {
      /// <summary>
      /// This method simply duplicates the String.Join() method that was introduced in .Net 4.0. So
      /// it can be used in C# projects targeting .Net 3.5 or earlier.
      /// </summary>
      /// <typeparam name="T">type of the object collection (typically string)</typeparam>
      /// <param name="separatorString">separator to be placed between the strings</param>
      /// <param name="valueObjects">collection of objects that can be converted to strings</param>
      /// <returns>string containing all of the objects converted to string with separator string in between</returns>
      public static string Join<T>(string separatorString, IEnumerable<T> valueObjects)
      {
         if (separatorString == null)
            separatorString = "";

         bool firstValue = true;
         StringBuilder stringBuilder = new StringBuilder();
         foreach (T oneObject in valueObjects)
         {
            if (!firstValue)
               stringBuilder.Append(separatorString);
            firstValue = false;

            stringBuilder.Append(oneObject == null ? "" : oneObject.ToString());
         }

         return stringBuilder.ToString();
      }
   }