¿Cómo genero una secuencia de una cadena?

Necesito escribir una prueba unitaria para un método que toma una secuencia que proviene de un archivo de texto. Me gustaría hacer algo como esto:

Stream s = GenerateStreamFromString("a,b \nc,d"); 

 public static Stream GenerateStreamFromString(string s) { var stream = new MemoryStream(); var writer = new StreamWriter(stream); writer.Write(s); writer.Flush(); stream.Position = 0; return stream; } 

No olvides usar Using:

 using (var stream = GenerateStreamFromString("a,b \nc,d")) { // ... Do stuff to stream } 

Acerca de StreamWriter no se elimina. StreamWriter es solo un contenedor alrededor de la transmisión base, y no utiliza ningún recurso que deba eliminarse. El método Dispose cerrará el Stream subyacente en el que StreamWriter está escribiendo. En este caso, ese es el MemoryStream que queremos devolver.

En .NET 4.5 ahora hay una sobrecarga para StreamWriter que mantiene la secuencia subyacente abierta después de que se elimina el escritor, pero este código hace lo mismo y funciona con otras versiones de .NET también.

Consulte ¿Hay alguna forma de cerrar un StreamWriter sin cerrar su BaseStream?

Otra solución:

 public static MemoryStream GenerateStreamFromString(string value) { return new MemoryStream(Encoding.UTF8.GetBytes(value ?? "")); } 

Agregue esto a una clase de utilidad de cadena estática:

 public static Stream ToStream(this string str) { MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream); writer.Write(str); writer.Flush(); stream.Position = 0; return stream; } 

Esto agrega una función de extensión para que pueda simplemente:

 using (var stringStream = "My string".ToStream()) { // use stringStream } 
 public Stream GenerateStreamFromString(string s) { return new MemoryStream(Encoding.UTF8.GetBytes(s)); } 

Utilice la clase MemoryStream , llamando a Encoding.GetBytes para convertir su cadena en una matriz de bytes primero.

¿Necesita posteriormente un TextReader en la transmisión? De ser así, podría suministrar un StringReader directamente y omitir los pasos de MemoryStream y Encoding .

Usé una mezcla de respuestas como esta:

 public static Stream ToStream(this string str, Encoding enc = null) { enc = enc ?? Encoding.UTF8; return new MemoryStream(enc.GetBytes(str ?? "")); } 

Y luego lo uso así:

 String someStr="This is a Test"; Encoding enc = getEncodingFromSomeWhere(); using (Stream stream = someStr.ToStream(enc)) { // Do something with the stream.... } 

Aqui tienes:

 private Stream GenerateStreamFromString(String p) { Byte[] bytes = UTF8Encoding.GetBytes(p); MemoryStream strm = new MemoryStream(); strm.Write(bytes, 0, bytes.Length); return strm; } 

Creo que puede beneficiarse de usar un MemoryStream . Puede completarlo con los bytes de cadena que obtiene utilizando el método GetBytes de la clase Encoding .

Usamos los métodos de extensión que se enumeran a continuación. Creo que debes hacer que el desarrollador tome una decisión sobre la encoding, por lo que hay menos magia involucrada.

 public static class StringExtensions { public static Stream ToStream(this string s) { return s.ToStream(Encoding.UTF8); } public static Stream ToStream(this string s, Encoding encoding) { return new MemoryStream(encoding.GetBytes(s ?? "")); } } 

Versión ligeramente modificada de los métodos de extensión sugeridos en un comentario de @ JoelNet’s answer y @Shaun Bowe answer. Porque estoy de acuerdo con el comentario de @Palec.

 public static Stream ToStream(this string value) => ToStream(value, Encoding.UTF8); public static Stream ToStream(this string value, Encoding encoding) => new MemoryStream(encoding.GetBytes(value ?? string.Empty)); 
 ///  /// Get Byte[] from String ///  ///  ///  public static byte[] GetBytes(string str) { byte[] bytes = new byte[str.Length * sizeof(char)]; System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); return bytes; } ///  /// Get Stream from String ///  ///  ///  public static Stream GetStream(string str) { return new MemoryStream(GetBytes(str)); } 

Una buena combinación de extensiones de cadena:

 public static byte[] GetBytes(this string str) { byte[] bytes = new byte[str.Length * sizeof(char)]; System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); return bytes; } public static Stream ToStream(this string str) { Stream StringStream = new MemoryStream(); StringStream.Read(str.GetBytes(), 0, str.Length); return StringStream; }