-1

私は2つの配列を持っています:配列testAnswerは「試験への回答」を保持し、配列inputAnswersは「学生の試験への回答」を保持します。

コードを実行すると、2つの配列のすべての共通要素(正解)と、一般的でない要素(不正解)が表示されます。ただし、実際に正解/不正解を表示するのではなく、正解/不正解の総数を表示できるようにしたいと思います。

これまでの私のコード:

private void button1_Click(object sender, EventArgs e)
{
    //Array holding answers to test
    string[] testAnswer = new string[20] { "B", "D", "A", "A", "C", "A", "B", "A", "C", "D", "B", "C", "D", "A", "D", "C", "C", "B", "D", "A" };
    string a = String.Join(", ", testAnswer);

    //Reads text file line by line. Stores in array, each line of the file is an element in the array
    string[] inputAnswer = System.IO.File.ReadAllLines(@"C:\Users\Momo\Desktop\UNI\Software tech\test.txt");

    string b = String.Join(", ", inputAnswer);

    //Increments through array elements in both arrays and checks for matching elements. Displays in listBox.
    for (int i = 0; i < testAnswer.Length; i++)
    {
        if (testAnswer[i] == inputAnswer[i])
            listBox1.Items.Add(inputAnswer[i]); // or testAnswer[i], as appropriate
    }

    //Increments through array elements in both arrays and checks for uncommon elements. Displays in listBox.
    for (int i = 0; i < testAnswer.Length; i++)
    {
        if (testAnswer[i] != inputAnswer[i])
            listBox2.Items.Add(inputAnswer[i]);
    }
}
4

3 に答える 3

4

LINQを使用して結果を取得する方法は次のとおりです。

var results = 
    testAnswer
        .Zip(inputAnswer, (t, i) => new { t, i })
        .Aggregate(new { Correct = 0, Incorrect = 0 },
            (a, ti) => new
            {
                Correct = a.Correct + (ti.t == ti.i ? 1 : 0), 
                Incorrect = a.Incorrect + (ti.t != ti.i ? 1 : 0)
            });

次のような結果の匿名変数が生成されます。

匿名変数の結果

別のアプローチは次のとおりです。

var query = 
    testAnswer
        .Zip(inputAnswer, (t, i) => t == i)
        .ToLookup(x => x);

var results = new
{
    Correct = query[true].Count(),
    Incorrect = query[false].Count()
};
于 2012-08-27T07:34:18.903 に答える
0

次のコードは、最後に答えを保持する 2 つの整数を提供します。

private void button1_Click(object sender, EventArgs e)
{
    string[] testAnswer = new string[20] { "B", "D", "A", "A", "C", "A", "B", "A", "C", "D", "B", "C", "D", "A", "D", "C", "C", "B", "D", "A" };
    string a = String.Join(", ", testAnswer);



    //Reads text file line by line. Stores in array, each line of the file is an element in the array
    string[] inputAnswer = System.IO.File.ReadAllLines(@"C:\Users\Momo\Desktop\UNI\Software tech\test.txt");

    string b = String.Join(", ", inputAnswer);


    //Increments through array elements in both arrays and checks for matching elements. 
    //Displays in listBox.
    for (int i = 0; i < testAnswer.Length; i++)
    {
        if (testAnswer[i] == inputAnswer[i])
            listBox1.Items.Add(inputAnswer[i]); // or testAnswer[i], as appropriate
        else 
            listBox2.Items.Add(inputAnswer[i]);
        }

    int correctAns = listbox1.Items.Count;
    int wringAns = listbox2.Items.Count;
}
于 2012-08-27T07:30:09.863 に答える
-1

一般的な回答の数は、Enumerable.Intersect結果アイテム数、uncommon- Enumerable.Except結果アイテム数になります。

更新:コメントで間違った答えが出ると述べられている限り、そうではないことを証明してください:

  var testAnswers = new[] { 1, 2, 3 };
  var inputAnswers = new[] { 3, 2, 1 };
  var commonAnswers = testAnswers
            .Select((x, index) => Tuple.Create(x, index))
            .Intersect(inputAnswers.Select((y, index) => Tuple.Create(y, index)));      
于 2012-08-27T07:21:46.527 に答える