Я пытаюсь создать программу, которая будет перебирать каждый символ в строке и указывать, что индекс конкретного символа
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("enter");
string expression = Console.ReadLine();
foreach(char c in expression)
{
if (c == '+')
{
Console.WriteLine("plus detected! :{0}",expression.IndexOf(c));
}
}
Console.ReadLine();
}
}
}
Проблема с моим кодом заключается в том, что он не указывает индекс конкретного '+', который он выполняет в цикле, а вместо этого указывает первый экземпляр '+'
Как это можно исправить, чтобы вместо этого указывать конкретный индекс
(например, 1 + 2 + 3 + 4 + 5 должно дать "1,3,5,7", индексы (?) каждого '+')





Я предлагаю использовать цикл for:
for(int i = 0; i < expression.Length; i++){
if (expression[i]== '+'){
Console.WriteLine("plus detected! :{0}",i);
}
}
Спасибо, после прочтения это имеет смысл, я с трудом визуализирую ^ _ ^;
самый простой способ +1
Вы можете использовать цикл for для повторения выражения:
for(int i = 0; i < expression.length; i++)
{
if (expression[i] == '+')
{
Console.WriteLine("plus detected! :{0}", i);
}
}
Или вы вводите собственный счетчик
int i = 0;
foreach(char c in expression)
{
if (c == '+')
{
Console.WriteLine("plus detected! :{0}", i);
}
i++;
}
начать i с 0
Ах, это тоже полезно, так как мне все еще было любопытно, возможно ли это с петлей foreach :) спасибо!
foreach - это, по сути, просто автоматизированный цикл for, в котором вы получаете объекты и вам не нужно самостоятельно обрабатывать индексы. Использование foreach с последующим сохранением увеличиваемого вручную индекса лишает смысла использование foreach и является явным запахом кода.
Спасибо за разъяснения;) Это все еще способ с наименьшим рефакторингом, и я указал на возможность цикла for. Подход Aominès определенно самый элегантный.
Самым простым решением было бы использовать цикл for, предложенный @Ali Ezzat Odeh. Другое решение - использовать Enumerable.Range:
var indices = Enumerable.Range(0, expression.Length)
.Where(index => expression[index] == '+');
foreach(var index in indices)
Console.WriteLine(index);
О, это умно.
Эта небольшая модификация решит вашу проблему, сохранив при этом исходный код:
//you could even use byte for this to save memory :)
int index = -1;
Console.WriteLine("enter");
string expression = Console.ReadLine();
foreach (char c in expression)
if (c == '+')
Console.WriteLine("plus detected! :{0}", (index = expression.IndexOf(c,index + 1)));
Console.ReadLine();
ох это интересно! Спасибо, я тоже попробую: D
Если вам нужен индекс, просто не используйте
foreach. Используйте обычный циклfor, а затем получил index.