Пропуск диапазона значений в течение l oop C# - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь перебрать символы в строке.

string cycleMe = "Hi StackOverflow! Here is my string."

Однако я хочу пропустить определенные диапазоны индексов. Диапазоны, которые я хочу пропустить, хранятся в Списке объектов, разделителях.

List<Delim> delims = delimCreator();

Чтобы извлечь каждый начальный индекс и конечный индекс для диапазона, я должен написать al oop, который обращается к каждому " delim ":

delims[0].getFirstIndex() //results in, say, index 2
delims[0].getLastIndex() //results in, say, index 4

delims[1].getFirstIndex() //results in, say, index 5
delims[1].getLastIndex() //results in, say, index 7

(в игре может быть бесконечно много объектов" delim ")

Если бы выше был мой список, я хотел бы напечатать строку cycleMe, но пропустить все символы от 2 до 4 (включительно) и от 5 до 7 (включительно).

Ожидаемый вывод с использованием приведенных выше чисел:

HiOverflow! Here is my string.

Вот код, который я написал до сих пор. Он зацикливается гораздо чаще, чем я ожидал (он зацикливает ~ x2 количество символов в строке). Заранее спасибо! =)

  List<Delim> delims = delimAggregateInator(displayTextRaw);

  for (int x = 0; x < cycleMe.Length;x++){

    for (int i = 0; i < delims.Count; i++){

      if (!(x >= delims[i].getFirstIndex() && x <= delims[i].getLastIndex())){


          Debug.Log("test");


      }
    }

Ответы [ 3 ]

3 голосов
/ 10 марта 2020

Я предполагаю, что, пропуская, вы имели в виду, что вы хотите опустить эти символы в исходной строке. Если это так, вы можете попробовать метод агрегирования расширений, как показано ниже.

string result = delims.Aggregate<Delim, string>(cycleMe, (str, d) => cycleMe = cycleMe.Remove(d.FirstIndex, (d.LastIndex - d.FirstIndex) + 1));

Убедитесь, что список разделителей находится в правильном порядке.

1 голос
/ 10 марта 2020

Вы должны использовать LINQ для этого

        struct Delim
        {
            public int First { get; set; }
            public int Last { get; set; }
        }

        static void Main(string[] args)
        {
            string cycleMe = "Hi StackOverflow! Here is my string.";

            var delimns = new List<Delim> { new Delim { First=2, Last=4}, new Delim { First = 5, Last = 7 } };

            var cut = cycleMe.Where((c, i) => 
               !delimns.Any(d => i >= d.First && i <= d.Last));

            Console.WriteLine(new string(cut.ToArray());
        }

Это означает, что я в основном выбираю только буквы в позициях, которые не являются частью какого-либо диапазона обрезки.

Также: исправьте свое наименование. Разделитель - это символ, а не позиция (nummeri c)

1 голос
/ 10 марта 2020

Решением может быть преобразование строки в массив символов, замена нужных частей в пробелы и преобразование вывода обратно в строку.

Вот модифицированная версия вашего кода:

string cycleMe = "Hi StackOverflow! Here is my string."
var charArray = cycleMe.ToCharArray(); // Converting to char array

List<Delim> delims = delimAggregateInator(displayTextRaw);
for (int x = 0; x < cycleMe.Length;x++){
  for (int i = 0; i < delims.Count; i++){
    // ORIGINAL: if (!(x >= delims[i].getFirstIndex() && x <= delims[i].getLastIndex())){
    if (x >= delims[i].getFirstIndex() && x <= delims[i].getLastIndex()){
       Debug.Log("test");
       charArray[x] = ' '; // Replacing the item with space
    }
}

string output = new string(charArray); // Converting back to string

PS Это, вероятно, не самое оптимальное решение, но, по крайней мере, оно должно работать.

...