Как убрать каждый элемент из списка и положить его sh в стек? - PullRequest
3 голосов
/ 19 марта 2020
string filePath = @"C:\Users\Me\Desktop\Palindromes\palindromes.txt";

List<string> lines = File.ReadAllLines(filePath).ToList();
var meStack = new Stack<string>();

for (int i = 0; i < lines.Count; i++)
{
    string pali;
    pali = lines.RemoveAt(i);
    meStack.Push(pali[i]);
}

В основном мне нужно Remove каждый элемент (в txt есть 40 строки) от list и затем Push каждый один на stack.

Ответы [ 4 ]

5 голосов
/ 19 марта 2020

Зачем вообще составлять список List<String>? ReadAllLines отвечает String[]. А Stack принимает массив в качестве параметра конструктора ... Итак, будет ли код ниже выполнять эту работу за вас?

  string filePath = @"C:\Users\Me\Desktop\Palindromes\palindromes.txt";
  var meStack = new Stack<string>(File.ReadAllLines(filePath));
3 голосов
/ 19 марта 2020

Не RemoveAt, а Clear (при необходимости) список lines в самом конце :

  for (int i = 0; i < lines.Count; ++i)
    meStack.Push(lines[i]);

  lines.Clear();

Или даже (мы можем избавиться от списка на все):

  string filePath = @"C:\Users\Me\Desktop\Palindromes\palindromes.txt";

  var meStack = new Stack<string>(); 

  foreach (var item in File.ReadLines(filePath))
    meStack.Push(item);
2 голосов
/ 19 марта 2020

Ваш код с некоторыми комментариями:

string filePath = @"C:\Users\Me\Desktop\Palindromes\palindromes.txt";
List<string> lines = File.ReadAllLines(filePath).ToList();
var meStack = new Stack<string>();

for (int i = 0; i < lines.Count; i++)
{
   string pali;
   pali = lines.RemoveAt(i); // < this will return AND REMOVE the line from the list.
                             // now, what was line i+1 is now line i, next iteration
                             // will return and remove (the new) line i+1, though,
                             // skipping one line.
   meStack.Push(pali[i]);    // here you push one char (the ith) of the string (the line you  
                             // just removed) to the stack which _may_ cause an 
                             // IndexOutOfBounds! (if "i" >= pali.Length )
}

Теперь, так как я не хочу повторять другие (отличные) ответы, вот один, где вы можете использовать RemoveAt:

while( lines.Count > 0 ) // RemoveAt will decrease Count with each iteration
{
    meStack.Push(lines.RemoveAt(0)); // Push the whole line that is returned.
    // Mind there is hardcoded "0" -> we always remove and push the first
    // item of the list.
}

Что не является лучшим решением , просто еще одна альтернатива.

2 голосов
/ 19 марта 2020

Вы можете упростить его до

lines.ForEach(meStack.Push);
lines.Clear();
...