Работа со строками С#

Начал изучать С#. Не совсем понимаю некоторые моменты в этом коде:

Console.Write("Enter a word: ");
            string str2 = Console.ReadLine();
            string[] arr = str2.ToLower().Split(new char[] {' '});
            string[] newArr = new string[arr.Length];
            char ch1;
            for (int i = 0; i < arr.Length; i++)
            {
                ch1 = arr[0][0];
                newArr[i] = arr[i].Replace(ch1.ToString(), "");
                if (i == 0)
                    Console.Write(ch1);
                Console.WriteLine(newArr[i]);
            }
            Console.WriteLine();

Не понимаю, что происходит в цикле. Помогите разобраться пожалуйста.

Что мешает запустить в отладчике и посмотреть на каждом шаге что происходит со строкой?

Потому что автор кода не дал нормальные имена переменным :laughing:

Да и тут бред написан

Пишет “введите слово”, а потом разделяет строку по пробелам. Откуда в одном слове пробелы возьмутся.

Так а где код найден был? Там не описана задача?)
Тогда можно ж просто запустить и посмотреть.
Или с отладчиком пройти. https://docs.microsoft.com/ru-ru/visualstudio/get-started/csharp/tutorial-debugger?toc=%2Fvisualstudio%2Fdebugger%2Ftoc.json&view=vs-2019#set-a-breakpoint-and-start-the-debugger

Похоже, удаляет первую букву первого слова из всех слов кроме первого:

Enter a word:  foo bar foobar barfoo
foo
bar
oobar
baroo

Условие такое вообще:
“Удалить из слова все последующие вхождения первого символа”

То есть если написать ананас, получится аннс. Оно как бы работает, но я не понимаю. А описания нет никакого

Автор кода явно не понял и на самом деле сделал это:

А это в две строки без циклов решается:

Console.Write("Enter a word: ");
string word = Console.ReadLine().Trim().ToLower();

string firstLetter = word[0].ToString();
string newWord = firstLetter + word.Substring(1).Replace(firstLetter, "");

Console.WriteLine(newWord);

Ну тут понятнее все гораздо. Спасибо большое

А вот тут можно сделать также изящно:

“Удалить в слове только последние вхождения каждого символа”?

То есть если пишешь слово “папа”, получается “па”

Я пытался использовать LastIndexOfAny, но наверно я не правильно понимаю смысл этого метода.

Без LastIndexOfAny

using System;
using System.Linq;
					
public class Program
{
	public static string Reverse( string s )
{
    char[] charArray = s.ToCharArray();
    Array.Reverse( charArray );
    return new string( charArray );
}
	
	public static void Main()
	{
		string code = "gfgf";
		Console.WriteLine(code);
    	string answer = new String(code.Distinct().ToArray());
    	for(int i = 0; i < answer.Length; i++)
    	{
			Console.WriteLine("\nCharacter: {0}",answer[i]);
			int first = code.IndexOf(answer[i]);
			Console.WriteLine("First occurrence: {0}", first);
			string code_r = Reverse(code);
      		int at = code.Length - code_r.IndexOf(answer[i]) - 1;
			Console.WriteLine("Last occurrence: {0}", at);
			Console.WriteLine(" Before deleting {0}",code);
      		if(at > first && at <= code.Length)
      		{
	        	code = code.Remove(at,1);
				Console.WriteLine(" After  deleting {0}",code);
	      	}
	    }
		Console.WriteLine();
   		Console.WriteLine(code);
	}
}
1 лайк

Так вроде бы работает

            Console.Write("Enter a word: ");
            string word = Console.ReadLine().Trim().ToLower();

            var uniqueLetters = word.Distinct();

            foreach (var letter in uniqueLetters)
            {
                word = word.Remove(word.LastIndexOf(letter), 1);
            }

            Console.WriteLine(word);
1 лайк

Красиво, но работает некорректно. Если вхождение одно, то символ тоже удаляется.

Так а это некорректно? В задаче не сказано про это. Если вхождение одно, то оно и есть последнее )

Согласен, надо бы уточнить