0

文字列のリストを int のリストに変換するためのコードを作成しようとしていました。 ConvertAllList<int> list = listOfStr.ConvertAll<int>(delegate(string s) { return ConvertStringToInt(s); });から行を取得しました。

    public static List<int> ConvertListOfStringToListOfInt(List<string> listOfStr)
    {
        List<int> list = listOfStr.ConvertAll<int>(delegate(string s) { return ConvertStringToInt(s); });

        return list;
    }
    /// <summary>
    /// converts the given str to integer
    /// </summary>
    /// <param name="str">string to be converted</param>
    /// <returns>returns the int value of the given string</returns>
    public static int ConvertStringToInt(string str)
    {
        int convertedValue = int.Parse(str);

        //(int.TryParse(str, out convertedValue))
        return convertedValue;
    }

コードは 1 つのことを除いて正常に動作しています。

上記のメソッドの単体テストを作成しました。TestMethod以下です

        /// <summary>
        ///A test for ConvertListOfStringToListOfInt
        ///</summary>
        [TestMethod()]
        public void ConvertListOfStringToListOfIntTest()
        {
            List<string> listOfStr = new List<string> { "1", "2", "3"}; // TODO: Initialize to an appropriate value
            List<int> expected = new List<int> { 1, 2, 3}; // TODO: Initialize to an appropriate value
            List<int> actual;
            actual = Conversions.ConvertListOfStringToListOfInt(listOfStr);
            Assert.AreEqual(expected, actual);
            //Assert.Inconclusive("Verify the correctness of this test method.");
        }

メソッドと期待されるリストを渡すリストに同じ値を与えましたが、タイプが異なるだけです(期待されるのは整数のリストであり、渡されるリストは文字列のリストです)。テストを実行すると、次のエラー メッセージが表示されました。

Assert.AreEqual failed. Expected:<System.Collections.Generic.List`1[System.Int32]>. Actual:<System.Collections.Generic.List`1[System.Int32]>.

まあ、型は実際には等しいので、リスト内に何か違うものがあるのではないかと思い、デバッグしました。

それは 4 であることが判明しlistOfStr.Capacity、アイテム メンバーの [3] アイテムとして null アイテムを持っていますexpected.Capacity

ただし、actual.Capacityそれは 3 であり、実際には items メンバーに 3 つのアイテムがあります。

私はそれを埋める前にnewingしようとし、値をメソッドに追加してリストに追加するために使用しました。しかし、容量は同じです。この方法は容量が決まっているリストには使用されないため、手動で容量を設定したくありません。actuallist.Add()expectednewConvertListOfStringToListOfInt

このテストに合格するにはどうすればよいですか? 容量が違うのはなぜ?また、リストの容量はどのように決定され、何に依存していますか?

これは .NET Framework 4.0 です。

4

3 に答える 3

2

a の容量はList<T>デフォルトで 4 です。アイテムを1つずつ追加すると、現在の容量を超える要素が追加されるたびに2倍になります。

http://msdn.microsoft.com/en-us/library/y52x03h2.aspx

私の意見では、この場合、容量について心配する必要はありません。単体テストに合格するには、リストの初期化を変更できます。

List<int> expected = new List<int>(3) { 1, 2, 3};

メソッドの最適化によりConvertAll、古い容量が使用されます。

1 つのヒント:

すべてのパフォーマンスを最適化することに関心がない場合は、この方法を次のように置き換えることができます。

listOfStr.Select(s => int.Parse(s)).ToList();

よりメンテナンスしやすくするためです。

于 2012-06-28T13:10:01.760 に答える
2

これを試して:

Assert.IsTrue(actual.SequenceEqual(expected));

その理由は、リストは複雑なオブジェクトであり、リストの等価性は各要素が同じであることによって決定されるのではなく、同じリストを指していると定義されるためです。sequence equalメソッドは、リストを繰り返し処理し、アイテム レベルでの等価性を判断します。

リストの項目が複合型の場合、それらの項目にはデフォルトの等値比較子が使用されます。

于 2012-06-28T13:19:44.080 に答える
1

やってみました:

Assert.IsTrue(expected.SequenceEqual<int>(actual));
于 2012-06-28T13:19:08.110 に答える