Pregunta ¿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 \n c,d");

594
2017-12-10 08:14


origen


Respuestas:


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 \n c,d"))
{
    // ... Do stuff to stream
}

Acerca de StreamWriter no ser eliminado StreamWriter es solo un envoltorio alrededor de la transmisión base y no utiliza ningún recurso que deba desecharse. los Dispose método cerrará el subyacente Stream ese StreamWriter está escribiendo a. En este caso, ese es el MemoryStream queremos regresar

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.

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


767
2017-12-10 08:28



Otra solución:

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

572
2018-03-08 21:02



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
}

98
2018-03-25 15:08



public Stream GenerateStreamFromString(string s)
{
    return new MemoryStream(Encoding.UTF8.GetBytes(s));
}

34
2018-01-03 18:19



Utilizar el MemoryStream clase, llamando Encoding.GetBytes para convertir tu cadena en una matriz de bytes primero.

¿Necesitas posteriormente un TextReader en la corriente? Si es así, podrías suministrar un StringReader directamente, y eludir el MemoryStream y Encoding pasos.


20
2017-12-10 08:17



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....
}

11
2018-02-03 09:36



Aqui tienes:

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

9
2017-12-10 08:27



Creo que puede beneficiarse de usar un MemoryStream. Puede llenarlo con los bytes de cadena que obtiene al usar GetBytes método de la Clase de codificación.


8
2017-12-10 08:18



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 codificación, 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 ?? ""));
    }
}

7
2017-07-15 15:19



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));

0
2018-03-01 12:37



/// <summary>
/// Get Byte[] from String
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
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;
}

/// <summary>
/// Get Stream from String
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static Stream GetStream(string str)
{
  return new MemoryStream(GetBytes(str));
}

-1
2018-02-08 13:34