2013-11-20 3 views
10

デバッガで単一項目が設定されたリストを見ると、_itemsフィールドには4つの要素が含まれます。あなたはその行動を説明できますか?リストはちょうど1つの要素で満たされていても、デバッガの4つの項目を表示します

私は、コンソールアプリケーションをデバッグしてDistinctToListについて学んでいて、結果が私を混乱させることが分かっています。コード:(6, 0, 0, 0)、明らかに間違っている:

List<int> nums = new List<int>() { 6, 6, 6, 6, 6, 6, 6, 6 }; 
List<int> distinctNums = nums.Distinct().ToList(); 
int[] distinctNums2 = nums.Distinct().ToArray(); 
  • distinctNums_itemsで4つの要素を持っています。
  • distinctNums2には、1つの項目(6)がありますが正しいです。
+2

どちらもリスト内の単一の要素を返しています。どのように結果を確認していますか? – Habib

+1

私はデバッガの関与を反映するために投稿を大幅に更新しました。あなたがそれが気に入らなければ自由に編集してください。 –

答えて

12

これにより、期待通りに1つのアイテムしか含まれていないリストdistinctNumsが作成されます。ただし、.NETのリストには配列が付いています。この配列はアイテムを追加すると自動的にサイズが変更されます。この配列は、サイズが4で始まるので、リフレクションまたはデバッガでプローブすると、内部配列は[4, 0, 0, 0]になります。

しかし、確認すると、distinctNums.Count == 1と表示されます。 CountCapacityのプロパティを比較してください。

+1

+1内部の素敵な内訳です​​! –

+0

OPのように見えますが、アイテムの数を確認するには「容量」ですか?とてもひどい。 –

+1

+1 @KingKing - より多くの可能性のあるOPは、最初の実際のフィールドを見るまで "+"を単にクリックしました(デバッグ中にVSエディタでリストを見て、 "Raw view"をクリックしてみてください) –

3

distinctNumsdistinctNums2は、実際には1つのオブジェクトしか含んでいません。

デバッガで表示されている4つの項目のリストは、List<int>をバックアップする配列だけです。そのCount1であり、リストを反復すると、単一の6が返されることがわかります。

1

List<T>は、T[](標準配列)の上の抽象です。配列のサイズは関係ありません。コンパイラがnew T[1]を割り当てない1つの項目にList<T>を割り当てると、拡張する余地があります(比較的高価な操作である元の配列よりも新しい配列を再配置して項目をコピーする必要があります)。 Countにはリストの長さが与えられ、そのリストでそれを呼び出すと1になります。他の3つのインデックスはデフォルト値が0でリストの一部ではなく、基本配列の一部です。彼らは関連性がありません。あなたがmyList[3]を実行しようとしました場合は例外を取得あなたはまだ、それだけで0

は両方のケースDistinct戻り、一つの項目とIEnumberable<int>で、元の質問に、このバックを持参することを返しませんでしょう。 ToListを呼び出すと、新しいリストが割り当てられます。カウントは1です。基礎となるデータ構造はint[]で、始点の長さは4です。 2番目の例ではToArrayを呼び出して、新しいint[1]を割り当てて、その参照を返します。

関連する問題