Какой самый простой способ пропустить строку в управляемой строке ^ VC++

Я пытаюсь пропустить строку в массиве String^ или String^, управляемом Visual C++, но я не нашел простого способа сделать это. На самом деле, я потратил два дня на то, что на C# заняло бы менее 30 секунд. В C# Enumerable есть метод .Skip().

https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.skip?view=netframework-4.7.2

и я хотел бы что-то подобное для VC++, если это возможно.

Вот что я пробовал:

    auto a = gcnew cli::array<String ^>{ "Alpha", "Bravo", "Charlie", "Delta" };

    auto xs = gcnew System::Collections::Generic::List<String^>(a);

    System::Collections::Generic::IEnumerator<String^>^ e = xs->GetEnumerator();

    e->MoveNext();

^^, который вызывает класс исключения System::EventArgs, не имеет члена "MoveNext"

РЕДАКТИРОВАТЬ: я знаю, что вызывает исключение System::EventArgs не имеет члена "MoveNext".. использование "e" в Visual Studio заставляет компилятор думать, что я имею в виду e для EventArgs, как в e) click_method.. Я переключился на другое имя и заполняется следующим образом: System.Collections.Generic.List`1+Enumerator[System.String]

Я также пробовал ссылаться на System::Linq, а затем

    System::Collections::Generic::List<String ^>^ _list = gcnew System::Collections::Generic::List<String ^>(System::IO::File::ReadAllLines(filename));

    System::Collections::Generic::List<String ^>^ _list2 = _list->Skip(1);

что похоже на то, что это будет работать на С#, но получить следующее исключение

class System::Collections::Generic::List не имеет члена skip

поэтому библиотека .NET не работает в CLI/C++

Еще одна вещь, которую я попытался:

    System::Collections::Generic::List<String ^>^ _list = gcnew System::Collections::Generic::List<String ^>(System::IO::File::ReadAllLines(filename));

    System::Collections::Generic::List<String ^>^ _list2 = _list->RemoveAt(0);

но есть исключение: значение типа "void" нельзя использовать для инициализации объекта типа System::Collections::Generic::List^

Я пытаюсь сделать это без использования marshal_string, если это возможно, но я открыт для любых предложений, так как я рвал на себе волосы, не зная, что еще попробовать = [


person hexagod    schedule 18.12.2018    source источник
comment
Методы расширения - это просто статические методы, поэтому я предполагаю, что вы можете вызвать их вручную: Enumerable::ToList(Enumerable::Skip(_list, 1)); но не предполагайте, что это лучший способ. (Обратите внимание, что возвращаемое значение из Skip не является List<> - следите за своими типами, и это вам очень поможет.) См. этот ответ.   -  person NetMage    schedule 19.12.2018
comment
Обратите внимание, что мне это кажется XY-проблемой — клонирование List^ для удаления first element — довольно неэффективный способ обработки списка.   -  person NetMage    schedule 19.12.2018
comment
@NetMage /* хорошо... это определенно помогло, но я все еще не пропускаю строчку*/   -  person hexagod    schedule 19.12.2018
comment
Мне непонятно, что означает пропуск строки в контексте String^ или List<String^>^?   -  person NetMage    schedule 19.12.2018
comment
@NetMage /* да, это потому, что я изначально хотел добиться этого с помощью одной строки ^, но позже я переключился на массив строк ^ из-за того, что не смог найти достаточно ресурсов. Я понял, как сделать это как массив, а не как одну строку ^ */   -  person hexagod    schedule 19.12.2018
comment
Ресурсы? Я думаю, это должен быть отдельный вопрос... Я все еще думаю, что сейчас недостаточно информации.   -  person NetMage    schedule 19.12.2018
comment
да это понятно. Эта ветка мертва. Я закончил с CLI/C++, огромная трата времени   -  person hexagod    schedule 20.12.2018
comment
когда я говорю ресурсы, я имею в виду бесплатные учебные пособия и предварительные вопросы по CLI, а не системные ресурсы   -  person hexagod    schedule 20.12.2018


Ответы (1)


РЕДАКТИРОВАТЬ: это читается как массив, а не String^, но я не мог понять, как это сделать с помощью String^ самостоятельно.

определенно не самый быстрый способ, но он пропускает x строк.

Я устал от CLI/C++/VC++ и не могу дождаться, когда перестану его использовать (в первую очередь я должен был никогда не использовать его и каждый день корить себя за то, что не сделал этого на C#).

    //read the file to a CLI array (each line is a member)
    auto a = System::IO::File::ReadAllLines("test66.txt");

    //create a List from the array
    auto xs = gcnew System::Collections::Generic::List<String^>(a);

    //create a collection from the List
    System::Collections::Generic::IEnumerator<String^>^ test66 = xs->GetEnumerator();

    //the number of lines we want to skip 
    int x = 0;

    //for loop stopping @ x
    for (int nxt; nxt <= x; nxt++)
    {
        test66->MoveNext();
    }

    //present selected array item to user or you could feed this into a String^
    textBox11->Text = test66->Current;

не стесняйтесь дать лучший ответ. Я не смог найти много информации, так как CLI/C++ абсолютно ужасен по сравнению с C# и почти любым другим современным языком. (ИМО)

person hexagod    schedule 19.12.2018