0

生徒のデータ (名前と年齢) を .txt ファイルに保存するプログラムをコーディングしています。私は今deleteメソッドをやっています。ただし、ユーザーが文字列を入力すると、入力を my の文字列と比較する必要がList<string>あります。これは名前でいっぱいです。コード:

    string tempFileName;
    string inputSel; // Selection string for delete
    Console.WriteLine(" -- Deleting Grade {0} -- ", grade);
    Console.WriteLine("- Enter a student name to delete: ");
    foreach (string file in fileNames)
    {
        tempFileName = file.Replace(".txt", "");
        studentNames.Add(tempFileName);
    }
    foreach (string name in studentNames)
    {
        Console.Write("{0}\n", name);
    }
    Console.WriteLine();
    Console.Write("> ");
    inputSel = Console.ReadLine();
    string input = inputSel.ToLower();
    string tempString;
    bool foundString = false;
    foreach (string file in studentNames)
    {
        tempString = file.ToLower();
        if (inputSel == tempString)
        {
            foundString = true;
        }
    }
    if (!foundString)
    {
        Console.WriteLine("Wrong name entered!");
        Console.WriteLine("Returning to grades menu..");
        Console.WriteLine("Press any key to continue.");
        Console.ReadKey();
        return;
    }  

ご覧のとおり、プログラムは (ToLower()) に格納inputSelしてからinput、 studentNamesList<string>の各文字列を比較し、一致が見つかった場合は foundString を反転しますが、一致boolする名前を入力しても (たとえば、JacobMusterson と表示されます) JacobMusterson に入ります。「学生が見つかりません」をスキップするはずですが、スキップしません。

4

5 に答える 5

2

inputSel ではなく input を使用する必要があります

if (input == tempString)
{
    foundString = true;
}

行のため:

string input = inputSel.ToLower();

inputSel の下位バージョンを入力するために割り当てている場所

ToLower() を作成しない場合は、string.Compare で IngonreCase を使用することをお勧めします。

var b =  string.Compare("a","A",StringComparison.OrdinalIgnoreCase);

等しい場合は0を返しますここを参照

編集:

個人的に私は使用します:

var exists = studentNames.Any(x=>string.Compare(x,inputSel,StringComparison.OrdinalIgnoreCase)==0);
于 2013-10-30T07:47:49.827 に答える
1

次の方法で簡単に実行できます。

Boolean foundString = studentNames.Exists(name => name.ToLower().Equals(input));
于 2013-10-30T07:57:29.583 に答える
0

Contains次の方法を使用すると、より読みやすく効果的になりますList

foreach (string file in studentNames)
    {
        tempString = file.ToLower();
        if (inputSel == tempString)
        {
            foundString = true;
        }
    }
if (!foundString)
    {
        Console.WriteLine("Wrong name entered!");
        Console.WriteLine("Returning to grades menu..");
        Console.WriteLine("Press any key to continue.");
        Console.ReadKey();
        return;
    }  

書き換えることができます:

if(!studentNames.Contains(inputSel, StringComparer.Create(CultureInfo.InvariantCulture, true)))
{
            Console.WriteLine("Wrong name entered!");
            Console.WriteLine("Returning to grades menu..");
            Console.WriteLine("Press any key to continue.");
            Console.ReadKey();
            return;
}
于 2013-10-30T07:53:09.040 に答える
0

foreach-loop に関するちょっとしたコメントです。文字列がコレクション内にあることがすでにわかっている場合も、ループ内のすべてのエントリを常に反復処理します。

最後の foreach を置き換えることで、コードのパフォーマンスを向上させることができます。

試す:

bool foundString = studentNames.Select(file => file.ToLower()).Any(tempString => inputSel == tempString);
于 2013-10-30T07:54:14.287 に答える