C# как исключить повторение букв

Здравствуйте, я пишу программу, которая должна вывести все слова, которые можно составить из введенного пользователем слова (например, пользователь вводит слово “абажур”, а программа выводит слова “арба”, “раб”, “бар” и так далее) Однако возникла проблема с тем, что программа использует одну и ту же букву в веденном слове несколько раз для производного слова. Подскажите, как можно исправить данную проблему. Вот код:

string word = Console.ReadLine(); // запрашиваем слово 
List<string> output = new List<string>();
string[] readText = File.ReadAllLines(path);  
            for(int i=0;i<readText.Length;i++)
            {
                bool f=true;
                for(int j=0;(j<readText[i].Length)&&(f==true) ;j++)
                {
                    if(word.Contains(readText[i][j]))
                    {
                        f = true;
                    }
                    else
                    {
                        f = false;
                    }                  
                }
                if (f == true)
                {
                    output.Add(readText[i]);
                }
            }
            for(int i =0;i<output.Count;i++)
            {
                Console.WriteLine(output[i]); // вывод списка на экран
            }         

f == true, f == false не надо никогда писать, достаточно f, !f.

Это как? И как надо?
Что в readText?

Например, при вводе того же слова “абажур” программа выводит и слово “барраж”, в введенном слове содержится лишь одна буква “р”, а программа выводит и те слова, в которых эта буква используется не один раз. Readtext - это массив строк, в каждой ячейке которого содержится по одному слову из русского языка

Самый простой вариант — превращать слово из массива в List<char> и при нахождении буквы удалять её.

    public static bool canMakeWord(char[] letters, string word)
    {
        var remainingLetters = new List<char>(word);
        foreach (var letter in letters)
        {
            remainingLetters.Remove(letter); // https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.remove
            if (remainingLetters.Count == 0)
            {
                return true;
            }
        }
        return false;
    }

    public static void Main(string[] args)
    {
        string word = "foobar";
        char[] wordLetters = word.ToCharArray();
        string[] existingWords = new [] { "foo", "bar", "barr", "fba", "barfoo", "xyz" };
        List<string> output = new List<string>();
        foreach (var existingWord in existingWords)
        {
            if (canMakeWord(wordLetters, existingWord))
            {
                output.Add(existingWord);
            }
        }
        Console.WriteLine(String.Join(Environment.NewLine, output));
    }

https://rextester.com/JXC31502

В Вашем условии нужно сравнивать кол-во одинаковых букв в двух словах, а не просто принадлежность - например, разности между длинами сравниваемых слов и полученными из них удалением символом функцией Trim(Char). Как-то так:

if(word.Length-word.Trim(readText[i][j]).Length>=readText[i].Length-readText[i].Trim(readText[i][j]).Length)

Да, еще флаг нужно сбрасывать или устанавливать только в одной из веток - иначе пред. проверка теряется.

Чот сложно :kolobokcrossing:

Удаление выше проще и понятнее )
И скорее всего даже быстрее.

Спасибо, вы очень помогли

Так это в контексте цикла с индексами у ТС, в foreach проще.

Это в принципе очень медленные алгоритмы.