I am looking over some code in Java here:
public String Build(String Str) {
Stack<Character> result = new Stack();
for (char x: Str.toCharArray()) {
if (x != '$')
result.push(x);
else
result.pop();
}
return String.valueOf(result); // Does C# have an equivalent for this?
}
Here's the working solution I wrote in C#, but I was wondering if theres an easier method?
public string Build(string s) {
Stack stack = new Stack();
foreach (char x in s.ToCharArray()) {
if (x != '$') {
stack.Push(x);
}
else
stack.Pop();
}
string result = String.Empty;
while (stack.Count != 0) { // In C#, I loop and store the value in a string.
result = stack.Peek();
stack.Pop();
}
return result;
}
Is there a better method in C# that would be similar to the first method posted in Java? I understand the method in C# is returning the string backwards, but that does not matter for the functionality of this method.
CodePudding user response:
The string constructor accepts char[]
, so that's probably what I'd use. You should also declare your stack to be of type Stack<char>
.
return new string(stack.ToArray())
CodePudding user response:
In c#, you can use string.Join<T>()
to join a collection.
This method can also be used with collections of ints, floats, doubles, strings... -- or any type that uses ToString()
.
MS Doc on "String.Join()": https://docs.microsoft.com/en-us/dotnet/api/system.string.join?view=net-6.0
In your case:
public string Build(string s) {
Stack<char> stack = new Stack<char>(); // USE GENERIC HERE
foreach (char x in s.ToCharArray()) {
if (x != '$') {
stack.Push(x);
}
else
stack.Pop();
}
return string.Join<char>("", stack);
}
Note that you need to use the generic version of Stack for this to work.
Basically, use Stack<char>
instead of Stack
.
It's almost always better to use Stack<T>
instead of Stack
if you know the type of T
. That is because Stack.Peek()
returns object
, meaning that you might get type errors when casting if you are not careful; however, Stack<T>.Peek()
returns T
, so it's usually safer to use Stack<T>
.
In this case, T
is "char"
If you haven't already, you need to write this at the top of your file:
using System.Collections.Generic;
MS Doc on "System.Collections.Generics": https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic?view=net-6.0