My task is creating method RemoveWordsFromContentAndWrite(StreamReader contentReader, StreamReader wordsReader, StreamWriter outputWriter) Description for my task with my study: The RemoveWordsFromContentAndWrite method should read the content from streamReader and then read words one by one from wordsReader, remove the words from the content, and write the updated content to outputWriter.
Use the StreamReader.Peek method for checking whether there are more characters in the underlying string. Store the content from contentReader to the StringBuilder instance, and use the StringBuilder.Replace method to remove words from the content string.
Example of the string StreamReader consumes:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
The word list string is as follows: "ipsumaliquased" For the string above, the RemoveWordsFromContentAndWrite method should write this text to the output stream:
"Lorem dolor sit amet, consectetur adipiscing elit, do eiusmod tempor incididunt ut labore et dolore magna ."
My solution, which is not good enough
public static void RemoveWordsFromContentAndWrite(StreamReader contentReader, StreamReader wordsReader, StreamWriter outputWriter)
{
while (contentReader.Peek() != -1)
{
var content = contentReader.ReadToEnd().Split(" ");
var words = wordsReader.ReadToEnd().Split(" ");
for (int i = 0; i < content.Length; i++)
{
for (int j = 0; j < words.Length; j++)
{
if (content[i].Equals(words[j], StringComparison.Ordinal))
{
content.ToList().Remove(words[j]);
}
}
}
foreach (var item in content)
{
if (item.Equals(content.LastOrDefault(), StringComparison.Ordinal))
{
outputWriter.Write(item);
outputWriter.Flush();
}
else
{
outputWriter.Write(item + " ");
outputWriter.Flush();
}
}
}
}
There are unit tests which unfortunately not passed
[TestCase("Lorem ipsum dolor sit amet", "ipsum", ExpectedResult = "Lorem dolor sit amet")]
[TestCase("Lorem ipsum dolor sit amet", "ipsum\namet", ExpectedResult = "Lorem dolor sit ")]
[TestCase("Lorem ipsum dolor sit amet", "ippsum", ExpectedResult = "Lorem ipsum dolor sit amet")]
[TestCase("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", "ipsum", ExpectedResult = "Lorem dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.")]
[TestCase("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", "ipsum\naliqua", ExpectedResult = "Lorem dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna .")]
[TestCase("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", "ipsum\naliqua\nsed", ExpectedResult = "Lorem dolor sit amet, consectetur adipiscing elit, do eiusmod tempor incididunt ut labore et dolore magna .")]
[TestCase("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", "ipsum\namet\neuysmod\nlabore\naliqua", ExpectedResult = "Lorem dolor sit , consectetur adipiscing elit, sed do eiusmod tempor incididunt ut et dolore magna .")]
[TestCase("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", "Lorem\nipsum\namet\neuysmod\nlabore\naliqua\ntempor\nsit\nsed\ndolore\ndolor\nconsectetur\nmagna\nadipiscing\nelit\neiusmod\nincididunt\ndo\net\nut", ExpectedResult = " , , .")]
public string RemoveWordsFromContentAndWrite_ArgumentsAreValid_WritesToStreamWriter(string content, string words)
{
// Arrange
var contentBytes = Encoding.ASCII.GetBytes(content);
using var contentStream = new MemoryStream(contentBytes);
using var contentReader = new StreamReader(contentStream);
var wordsBytes = Encoding.ASCII.GetBytes(words);
using var wordsStream = new MemoryStream(wordsBytes);
using var wordsReader = new StreamReader(wordsStream);
using var outputStream = new MemoryStream();
using var outputWriter = new StreamWriter(outputStream)
{
AutoFlush = true,
};
// Act
WritingToStream.RemoveWordsFromContentAndWrite(contentReader,
wordsReader, outputWriter);
// Assert
outputStream.Seek(0, SeekOrigin.Begin);
using var outputReader = new StreamReader(outputStream);
string updatedContent = outputReader.ReadToEnd();
return updatedContent;
}
I would be grateful for every help.