Skip to main content
.NET Framework Class Library
StringJoinT Method (String, IEnumerableT)

Concatenates the members of a collection, using the specified separator between each member.

Namespace:   System
Assembly:  mscorlib (in mscorlib.dll)
<[%$TOPIC/dd992421_en-us_VS_110_1_0_0_0_0%](False)> _
Public Shared Function Join(Of T) ( _
	separator As [%$TOPIC/dd992421_en-us_VS_110_1_0_0_0_1%], _
	values As [%$TOPIC/dd992421_en-us_VS_110_1_0_0_0_2%](Of T) _
) As [%$TOPIC/dd992421_en-us_VS_110_1_0_0_0_3%]
public static [%$TOPIC/dd992421_en-us_VS_110_1_0_1_0_1%] Join<T>(
	[%$TOPIC/dd992421_en-us_VS_110_1_0_1_0_2%] separator,
	[%$TOPIC/dd992421_en-us_VS_110_1_0_1_0_3%]<T> values
generic<typename T>
static [%$TOPIC/dd992421_en-us_VS_110_1_0_2_0_1%]^ Join(
	[%$TOPIC/dd992421_en-us_VS_110_1_0_2_0_2%]^ separator, 
	[%$TOPIC/dd992421_en-us_VS_110_1_0_2_0_3%]<T>^ values
static member Join : 
        separator:[%$TOPIC/dd992421_en-us_VS_110_1_0_3_0_1%] * 
        values:[%$TOPIC/dd992421_en-us_VS_110_1_0_3_0_2%]<'T> -> [%$TOPIC/dd992421_en-us_VS_110_1_0_3_0_3%]

Type Parameters


The type of the members of values.


Type: SystemString

The string to use as a separator. separator is included in the returned string only if values has more than one element.

Type: System.Collections.GenericIEnumerableT

A collection that contains the objects to concatenate.

Return Value

Type: SystemString
A string that consists of the members of values delimited by the separator string. If values has no members, the method returns StringEmpty.

values is .


If separator is , an empty string ( StringEmpty) is used instead. If any member of values is , an empty string is used instead.

JoinT(String, IEnumerableT) is a convenience method that lets you concatenate each member of an IEnumerableT collection without first converting them to strings. The string representation of each object in the IEnumerableT collection is derived by calling that object's ToString method.

This method is particular useful with Language-Integrated Query (LINQ) query expressions. For example, the following code defines a very simple Animal class that contains the name of an animal and the order to which it belongs. It then defines a ListT object that contains a number of Animal objects. The EnumerableWhere extension method is called to extract the Animal objects whose Order property equals "Rodent". The result is passed to the JoinT(String, IEnumerableT) method.

Imports System.Collections.Generic

Public Class Animal
   Public Kind As String 
   Public Order As String 

   Public Sub New(kind As String, order As String)
      Me.Kind = kind
      Me.Order = order
   End Sub 

   Public Overrides Function ToString() As String 
      Return Me.Kind
   End Function 
End Class 

Module Example
   Public Sub Main()
      Dim animals As New List(Of Animal)
      animals.Add(New Animal("Squirrel", "Rodent"))
      animals.Add(New Animal("Gray Wolf", "Carnivora"))
      animals.Add(New Animal("Capybara", "Rodent")) 
      Dim output As String = String.Join(" ", animals.Where(Function(animal) _
                                           animal.Order = "Rodent"))
   End Sub 
End Module 
' The example displays the following output: 
'      Squirrel Capybara
using System;
using System.Collections.Generic;
using System.Linq;

public class Animal
   public string Kind;
   public string Order;

   public Animal(string kind, string order)
      this.Kind = kind;
      this.Order = order;

   public override string ToString()
      return this.Kind;

public class Example
   public static void Main()
      List<Animal> animals = new List<Animal>();
      animals.Add(new Animal("Squirrel", "Rodent"));
      animals.Add(new Animal("Gray Wolf", "Carnivora"));
      animals.Add(new Animal("Capybara", "Rodent"));
      string output = String.Join(" ", animals.Where( animal => 
                      (animal.Order == "Rodent")));
// The example displays the following output: 
//      Squirrel Capybara

The following example uses the Sieve of Eratosthenes algorithm to calculate the prime numbers that are less than or equal to 100. It assigns the result to a ListT object of type integer, which it then passes to the JoinT(String, IEnumerableT) method.

Imports System.Collections.Generic

Module Example
   Public Sub Main()
      Dim maxPrime As Integer = 100
      Dim primes As List(Of Integer) = GetPrimes(maxPrime)
      Console.WriteLine("Primes less than {0}:", maxPrime)
      Console.WriteLine("   {0}", String.Join(" ", primes))
   End Sub 

   Private Function GetPrimes(maxPrime As Integer) As List(Of Integer)
      Dim values As Array = Array.CreateInstance(GetType(Integer), _
                              New Integer() { maxPrime - 1}, New Integer(){ 2 }) 
        ' Use Sieve of Eratosthenes to determine prime numbers. 
      For ctr As Integer = values.GetLowerBound(0) To _
         If CInt(values.GetValue(ctr)) = 1 Then Continue For 

         For multiplier As Integer = ctr To maxPrime \ 2
            If ctr * multiplier <= maxPrime Then values.SetValue(1, ctr * multiplier)

      Dim primes As New System.Collections.Generic.List(Of Integer)
      For ctr As Integer = values.GetLowerBound(0) To values.GetUpperBound(0)
         If CInt(values.GetValue(ctr)) = 0 Then primes.Add(ctr)
      Return primes
   End Function    
End Module 
' The example displays the following output: 
'    Primes less than 100: 
'       2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
using System;
using System.Collections.Generic;

public class Example
   public static void Main()
      int maxPrime = 100;
      List<int> primes = GetPrimes(maxPrime);
      Console.WriteLine("Primes less than {0}:", maxPrime);
      Console.WriteLine("   {0}", String.Join(" ", primes));

   private static List<int> GetPrimes(int maxPrime)
      Array values = Array.CreateInstance(typeof(int), 
                              new int[] { maxPrime - 1}, new int[] { 2 });
      // Use Sieve of Eratosthenes to determine prime numbers. 
      for (int ctr = values.GetLowerBound(0); ctr <= (int) Math.Ceiling(Math.Sqrt(values.GetUpperBound(0))); ctr++)

         if ((int) values.GetValue(ctr) == 1) continue;

         for (int multiplier = ctr; multiplier <=  maxPrime / 2; multiplier++)
            if (ctr * multiplier <= maxPrime)
               values.SetValue(1, ctr * multiplier);

      List<int> primes = new List<int>();
      for (int ctr = values.GetLowerBound(0); ctr <= values.GetUpperBound(0); ctr++)
         if ((int) values.GetValue(ctr) == 0) 
      return primes;
// The example displays the following output: 
//    Primes less than 100: 
//       2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Version Information

.NET Framework

Supported in: 4.5.2, 4.5.1, 4.5, 4

.NET Framework Client Profile

Supported in: 4

Portable Class Library

Supported in: Portable Class Library

.NET for Windows Store apps

Supported in: Windows 8

.NET for Windows Phone apps

Supported in: Windows Phone 8.1, Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core Role not supported), Windows Server 2008 R2 (Server Core Role supported with SP1 or later; Itanium not supported)

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.