Я пытаюсь пропустить строку в массиве 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, если это возможно, но я открыт для любых предложений, так как я рвал на себе волосы, не зная, что еще попробовать = [
Enumerable::ToList(Enumerable::Skip(_list, 1));
но не предполагайте, что это лучший способ. (Обратите внимание, что возвращаемое значение изSkip
не являетсяList<>
- следите за своими типами, и это вам очень поможет.) См. этот ответ а>. - person NetMage   schedule 19.12.2018List^
для удаления first element — довольно неэффективный способ обработки списка. - person NetMage   schedule 19.12.2018String^
илиList<String^>^
? - person NetMage   schedule 19.12.2018