ListDictionary 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
使用单向链接列表实现 IDictionary
。 对于通常包含少于 10 项的集合,建议使用该实现方法。
public ref class ListDictionary : System::Collections::IDictionary
public class ListDictionary : System.Collections.IDictionary
[System.Serializable]
public class ListDictionary : System.Collections.IDictionary
type ListDictionary = class
interface ICollection
interface IEnumerable
interface IDictionary
[<System.Serializable>]
type ListDictionary = class
interface IDictionary
interface ICollection
interface IEnumerable
Public Class ListDictionary
Implements IDictionary
- 继承
-
ListDictionary
- 属性
- 实现
示例
下面的代码示例演示 的几个属性和方法 ListDictionary。
#using <System.dll>
using namespace System;
using namespace System::Collections;
using namespace System::Collections::Specialized;
void PrintKeysAndValues1( IDictionary^ myCol );
void PrintKeysAndValues2( IDictionary^ myCol );
void PrintKeysAndValues3( ListDictionary^ myCol );
int main()
{
// Creates and initializes a new ListDictionary.
ListDictionary^ myCol = gcnew ListDictionary;
myCol->Add( "Braeburn Apples", "1.49" );
myCol->Add( "Fuji Apples", "1.29" );
myCol->Add( "Gala Apples", "1.49" );
myCol->Add( "Golden Delicious Apples", "1.29" );
myCol->Add( "Granny Smith Apples", "0.89" );
myCol->Add( "Red Delicious Apples", "0.99" );
// Display the contents of the collection using for each. This is the preferred method.
Console::WriteLine( "Displays the elements using for each:" );
PrintKeysAndValues1( myCol );
// Display the contents of the collection using the enumerator.
Console::WriteLine( "Displays the elements using the IDictionaryEnumerator:" );
PrintKeysAndValues2( myCol );
// Display the contents of the collection using the Keys, Values, Count, and Item properties.
Console::WriteLine( "Displays the elements using the Keys, Values, Count, and Item properties:" );
PrintKeysAndValues3( myCol );
// Copies the ListDictionary to an array with DictionaryEntry elements.
array<DictionaryEntry>^myArr = gcnew array<DictionaryEntry>(myCol->Count);
myCol->CopyTo( myArr, 0 );
// Displays the values in the array.
Console::WriteLine( "Displays the elements in the array:" );
Console::WriteLine( " KEY VALUE" );
for ( int i = 0; i < myArr->Length; i++ )
Console::WriteLine( " {0,-25} {1}", myArr[ i ].Key, myArr[ i ].Value );
Console::WriteLine();
// Searches for a key.
if ( myCol->Contains( "Kiwis" ) )
Console::WriteLine( "The collection contains the key \"Kiwis\"." );
else
Console::WriteLine( "The collection does not contain the key \"Kiwis\"." );
Console::WriteLine();
// Deletes a key.
myCol->Remove( "Plums" );
Console::WriteLine( "The collection contains the following elements after removing \"Plums\":" );
PrintKeysAndValues2( myCol );
// Clears the entire collection.
myCol->Clear();
Console::WriteLine( "The collection contains the following elements after it is cleared:" );
PrintKeysAndValues2( myCol );
}
// Uses the for each statement which hides the complexity of the enumerator.
// NOTE: The for each statement is the preferred way of enumerating the contents of a collection.
void PrintKeysAndValues1( IDictionary^ myCol ) {
Console::WriteLine( " KEY VALUE" );
for each ( DictionaryEntry^ de in myCol )
Console::WriteLine( " {0,-25} {1}", de->Key, de->Value );
Console::WriteLine();
}
// Uses the enumerator.
void PrintKeysAndValues2( IDictionary^ myCol )
{
IDictionaryEnumerator^ myEnumerator = myCol->GetEnumerator();
Console::WriteLine( " KEY VALUE" );
while ( myEnumerator->MoveNext() )
Console::WriteLine( " {0,-25} {1}", myEnumerator->Key, myEnumerator->Value );
Console::WriteLine();
}
// Uses the Keys, Values, Count, and Item properties.
void PrintKeysAndValues3( ListDictionary^ myCol )
{
array<String^>^myKeys = gcnew array<String^>(myCol->Count);
myCol->Keys->CopyTo( myKeys, 0 );
Console::WriteLine( " INDEX KEY VALUE" );
for ( int i = 0; i < myCol->Count; i++ )
Console::WriteLine( " {0,-5} {1,-25} {2}", i, myKeys[ i ], myCol[ myKeys[ i ] ] );
Console::WriteLine();
}
/*
This code produces the following output.
Displays the elements using for each:
KEY VALUE
Braeburn Apples 1.49
Fuji Apples 1.29
Gala Apples 1.49
Golden Delicious Apples 1.29
Granny Smith Apples 0.89
Red Delicious Apples 0.99
Displays the elements using the IDictionaryEnumerator:
KEY VALUE
Braeburn Apples 1.49
Fuji Apples 1.29
Gala Apples 1.49
Golden Delicious Apples 1.29
Granny Smith Apples 0.89
Red Delicious Apples 0.99
Displays the elements using the Keys, Values, Count, and Item properties:
INDEX KEY VALUE
0 Braeburn Apples 1.49
1 Fuji Apples 1.29
2 Gala Apples 1.49
3 Golden Delicious Apples 1.29
4 Granny Smith Apples 0.89
5 Red Delicious Apples 0.99
Displays the elements in the array:
KEY VALUE
Braeburn Apples 1.49
Fuji Apples 1.29
Gala Apples 1.49
Golden Delicious Apples 1.29
Granny Smith Apples 0.89
Red Delicious Apples 0.99
The collection does not contain the key "Kiwis".
The collection contains the following elements after removing "Plums":
KEY VALUE
Braeburn Apples 1.49
Fuji Apples 1.29
Gala Apples 1.49
Golden Delicious Apples 1.29
Granny Smith Apples 0.89
Red Delicious Apples 0.99
The collection contains the following elements after it is cleared:
KEY VALUE
*/
using System;
using System.Collections;
using System.Collections.Specialized;
public class SamplesListDictionary {
public static void Main() {
// Creates and initializes a new ListDictionary.
ListDictionary myCol = new ListDictionary();
myCol.Add( "Braeburn Apples", "1.49" );
myCol.Add( "Fuji Apples", "1.29" );
myCol.Add( "Gala Apples", "1.49" );
myCol.Add( "Golden Delicious Apples", "1.29" );
myCol.Add( "Granny Smith Apples", "0.89" );
myCol.Add( "Red Delicious Apples", "0.99" );
// Display the contents of the collection using foreach. This is the preferred method.
Console.WriteLine( "Displays the elements using foreach:" );
PrintKeysAndValues1( myCol );
// Display the contents of the collection using the enumerator.
Console.WriteLine( "Displays the elements using the IDictionaryEnumerator:" );
PrintKeysAndValues2( myCol );
// Display the contents of the collection using the Keys, Values, Count, and Item properties.
Console.WriteLine( "Displays the elements using the Keys, Values, Count, and Item properties:" );
PrintKeysAndValues3( myCol );
// Copies the ListDictionary to an array with DictionaryEntry elements.
DictionaryEntry[] myArr = new DictionaryEntry[myCol.Count];
myCol.CopyTo( myArr, 0 );
// Displays the values in the array.
Console.WriteLine( "Displays the elements in the array:" );
Console.WriteLine( " KEY VALUE" );
for ( int i = 0; i < myArr.Length; i++ )
Console.WriteLine( " {0,-25} {1}", myArr[i].Key, myArr[i].Value );
Console.WriteLine();
// Searches for a key.
if ( myCol.Contains( "Kiwis" ) )
Console.WriteLine( "The collection contains the key \"Kiwis\"." );
else
Console.WriteLine( "The collection does not contain the key \"Kiwis\"." );
Console.WriteLine();
// Deletes a key.
myCol.Remove( "Plums" );
Console.WriteLine( "The collection contains the following elements after removing \"Plums\":" );
PrintKeysAndValues1( myCol );
// Clears the entire collection.
myCol.Clear();
Console.WriteLine( "The collection contains the following elements after it is cleared:" );
PrintKeysAndValues1( myCol );
}
// Uses the foreach statement which hides the complexity of the enumerator.
// NOTE: The foreach statement is the preferred way of enumerating the contents of a collection.
public static void PrintKeysAndValues1( IDictionary myCol ) {
Console.WriteLine( " KEY VALUE" );
foreach ( DictionaryEntry de in myCol )
Console.WriteLine( " {0,-25} {1}", de.Key, de.Value );
Console.WriteLine();
}
// Uses the enumerator.
// NOTE: The foreach statement is the preferred way of enumerating the contents of a collection.
public static void PrintKeysAndValues2( IDictionary myCol ) {
IDictionaryEnumerator myEnumerator = myCol.GetEnumerator();
Console.WriteLine( " KEY VALUE" );
while ( myEnumerator.MoveNext() )
Console.WriteLine( " {0,-25} {1}", myEnumerator.Key, myEnumerator.Value );
Console.WriteLine();
}
// Uses the Keys, Values, Count, and Item properties.
public static void PrintKeysAndValues3( ListDictionary myCol ) {
String[] myKeys = new String[myCol.Count];
myCol.Keys.CopyTo( myKeys, 0 );
Console.WriteLine( " INDEX KEY VALUE" );
for ( int i = 0; i < myCol.Count; i++ )
Console.WriteLine( " {0,-5} {1,-25} {2}", i, myKeys[i], myCol[myKeys[i]] );
Console.WriteLine();
}
}
/*
This code produces output similar to the following.
Note that because a dictionary is implemented for fast keyed access the order
of the items in the dictionary are not gauranteed and, as a result, should not
be depended on.
Displays the elements using foreach:
KEY VALUE
Braeburn Apples 1.49
Fuji Apples 1.29
Gala Apples 1.49
Golden Delicious Apples 1.29
Granny Smith Apples 0.89
Red Delicious Apples 0.99
Displays the elements using the IDictionaryEnumerator:
KEY VALUE
Braeburn Apples 1.49
Fuji Apples 1.29
Gala Apples 1.49
Golden Delicious Apples 1.29
Granny Smith Apples 0.89
Red Delicious Apples 0.99
Displays the elements using the Keys, Values, Count, and Item properties:
INDEX KEY VALUE
0 Braeburn Apples 1.49
1 Fuji Apples 1.29
2 Gala Apples 1.49
3 Golden Delicious Apples 1.29
4 Granny Smith Apples 0.89
5 Red Delicious Apples 0.99
Displays the elements in the array:
KEY VALUE
Braeburn Apples 1.49
Fuji Apples 1.29
Gala Apples 1.49
Golden Delicious Apples 1.29
Granny Smith Apples 0.89
Red Delicious Apples 0.99
The collection does not contain the key "Kiwis".
The collection contains the following elements after removing "Plums":
KEY VALUE
Braeburn Apples 1.49
Fuji Apples 1.29
Gala Apples 1.49
Golden Delicious Apples 1.29
Granny Smith Apples 0.89
Red Delicious Apples 0.99
The collection contains the following elements after it is cleared:
KEY VALUE
*/
Imports System.Collections
Imports System.Collections.Specialized
Public Class SamplesListDictionary
Public Shared Sub Main()
' Creates and initializes a new ListDictionary.
Dim myCol As New ListDictionary()
myCol.Add("Braeburn Apples", "1.49")
myCol.Add("Fuji Apples", "1.29")
myCol.Add("Gala Apples", "1.49")
myCol.Add("Golden Delicious Apples", "1.29")
myCol.Add("Granny Smith Apples", "0.89")
myCol.Add("Red Delicious Apples", "0.99")
' Display the contents of the collection using For Each. This is the preferred method.
Console.WriteLine("Displays the elements using For Each:")
PrintKeysAndValues(myCol)
' Display the contents of the collection using the enumerator.
Console.WriteLine("Displays the elements using the IDictionaryEnumerator:")
PrintKeysAndValues2(myCol)
' Display the contents of the collection using the Keys, Values, Count, and Item properties.
Console.WriteLine("Displays the elements using the Keys, Values, Count, and Item properties:")
PrintKeysAndValues3(myCol)
' Copies the ListDictionary to an array with DictionaryEntry elements.
Dim myArr(myCol.Count) As DictionaryEntry
myCol.CopyTo(myArr, 0)
' Displays the values in the array.
Console.WriteLine("Displays the elements in the array:")
Console.WriteLine(" KEY VALUE")
Dim i As Integer
For i = 0 To myArr.Length - 1
Console.WriteLine(" {0,-25} {1}", myArr(i).Key, myArr(i).Value)
Next i
Console.WriteLine()
' Searches for a key.
If myCol.Contains("Kiwis") Then
Console.WriteLine("The collection contains the key ""Kiwis"".")
Else
Console.WriteLine("The collection does not contain the key ""Kiwis"".")
End If
Console.WriteLine()
' Deletes a key.
myCol.Remove("Plums")
Console.WriteLine("The collection contains the following elements after removing ""Plums"":")
PrintKeysAndValues(myCol)
' Clears the entire collection.
myCol.Clear()
Console.WriteLine("The collection contains the following elements after it is cleared:")
PrintKeysAndValues(myCol)
End Sub
' Uses the For Each statement which hides the complexity of the enumerator.
' NOTE: The For Each statement is the preferred way of enumerating the contents of a collection.
Public Shared Sub PrintKeysAndValues(myCol As IDictionary)
Console.WriteLine(" KEY VALUE")
Dim de As DictionaryEntry
For Each de In myCol
Console.WriteLine(" {0,-25} {1}", de.Key, de.Value)
Next de
Console.WriteLine()
End Sub
' Uses the enumerator.
' NOTE: The For Each statement is the preferred way of enumerating the contents of a collection.
Public Shared Sub PrintKeysAndValues2(myCol As IDictionary)
Dim myEnumerator As IDictionaryEnumerator = myCol.GetEnumerator()
Console.WriteLine(" KEY VALUE")
While myEnumerator.MoveNext()
Console.WriteLine(" {0,-25} {1}", myEnumerator.Key, myEnumerator.Value)
End While
Console.WriteLine()
End Sub
' Uses the Keys, Values, Count, and Item properties.
Public Shared Sub PrintKeysAndValues3(myCol As ListDictionary)
Dim myKeys(myCol.Count) As [String]
myCol.Keys.CopyTo(myKeys, 0)
Console.WriteLine(" INDEX KEY VALUE")
Dim i As Integer
For i = 0 To myCol.Count - 1
Console.WriteLine(" {0,-5} {1,-25} {2}", i, myKeys(i), myCol(myKeys(i)))
Next i
Console.WriteLine()
End Sub
End Class
'This code produces the following output.
'Note that because a dictionary is implemented for fast keyed access the order
'of the items in the dictionary are not gauranteed and, as a result, should not
'be depended on.
'
'Displays the elements using for each:
' KEY VALUE
' Braeburn Apples 1.49
' Fuji Apples 1.29
' Gala Apples 1.49
' Golden Delicious Apples 1.29
' Granny Smith Apples 0.89
' Red Delicious Apples 0.99
'
'Displays the elements using the IDictionaryEnumerator:
' KEY VALUE
' Braeburn Apples 1.49
' Fuji Apples 1.29
' Gala Apples 1.49
' Golden Delicious Apples 1.29
' Granny Smith Apples 0.89
' Red Delicious Apples 0.99
'
'Displays the elements using the Keys, Values, Count, and Item properties:
' INDEX KEY VALUE
' 0 Braeburn Apples 1.49
' 1 Fuji Apples 1.29
' 2 Gala Apples 1.49
' 3 Golden Delicious Apples 1.29
' 4 Granny Smith Apples 0.89
' 5 Red Delicious Apples 0.99
'
'Displays the elements in the array:
' KEY VALUE
' Braeburn Apples 1.49
' Fuji Apples 1.29
' Gala Apples 1.49
' Golden Delicious Apples 1.29
' Granny Smith Apples 0.89
' Red Delicious Apples 0.99
'
'The collection does not contain the key "Kiwis".
'
'The collection contains the following elements after removing "Plums":
' KEY VALUE
' Braeburn Apples 1.49
' Fuji Apples 1.29
' Gala Apples 1.49
' Golden Delicious Apples 1.29
' Granny Smith Apples 0.89
' Red Delicious Apples 0.99
'
'The collection contains the following elements after it is cleared:
' KEY VALUE
'
注解
这是使用单独链接列表的 IDictionary 简单实现。 如果元素数为 10 个或更少,则它比 Hashtable 更小、更快。 如果性能对大量元素很重要,则不应使用此选项。
中的 ListDictionary 项没有任何保证顺序;代码不应依赖于当前顺序。 ListDictionary实现 是为了快速键式检索;项的实际内部顺序取决于实现,并且可能在产品的未来版本中更改。
成员(如 、、 和 )是 O (n
) 操作,其中 n
为 Count。ContainsRemoveAddItem[]
键不能是 null
,但值可以。
foreach
Visual Basic) 中 C# 语言 (for each
语句返回集合中元素类型的 对象。 由于 的每个 ListDictionary 元素都是键/值对,因此元素类型不是键的类型或值的类型。 相反,元素类型为 DictionaryEntry。 例如:
for each (DictionaryEntry de in myListDictionary)
{
//...
}
foreach (DictionaryEntry de in myListDictionary)
{
//...
}
For Each de As DictionaryEntry In myListDictionary
'...
Next de
语句 foreach
是枚举器周围的包装器,它只允许从集合中读取,而不允许写入集合。
构造函数
ListDictionary() |
使用默认比较器创建空白 ListDictionary。 |
ListDictionary(IComparer) |
使用指定比较器创建空白 ListDictionary。 |
属性
Count |
获取包含在 ListDictionary 中的键/值对的数目。 |
IsFixedSize |
获取一个值,该值指示 ListDictionary 是否具有固定大小。 |
IsReadOnly |
获取一个值,该值指示 ListDictionary 是否为只读。 |
IsSynchronized |
获取一个值,该值指示 ListDictionary 是否是同步的(线程安全)。 |
Item[Object] |
获取或设置与指定的键关联的值。 |
Keys |
获取包含 ICollection 中的键的 ListDictionary。 |
SyncRoot |
获取可用于同步对 ListDictionary 的访问的对象。 |
Values |
获取一个 ICollection,它包含 ListDictionary 中的值。 |
方法
Add(Object, Object) |
将带有指定键和值的条目添加到 ListDictionary 中。 |
Clear() |
从 ListDictionary 中移除所有项。 |
Contains(Object) |
确定 ListDictionary 是否包含特定键。 |
CopyTo(Array, Int32) |
将 ListDictionary 项复制到位于指定索引处的一维 Array 实例中。 |
Equals(Object) |
确定指定对象是否等于当前对象。 (继承自 Object) |
GetEnumerator() |
返回循环访问 IDictionaryEnumerator 的 ListDictionary。 |
GetHashCode() |
作为默认哈希函数。 (继承自 Object) |
GetType() |
获取当前实例的 Type。 (继承自 Object) |
MemberwiseClone() |
创建当前 Object 的浅表副本。 (继承自 Object) |
Remove(Object) |
从 ListDictionary 中移除带有指定键的项。 |
ToString() |
返回表示当前对象的字符串。 (继承自 Object) |
显式接口实现
IEnumerable.GetEnumerator() |
返回循环访问 IEnumerator 的 ListDictionary。 |
扩展方法
Cast<TResult>(IEnumerable) |
将 IEnumerable 的元素强制转换为指定的类型。 |
OfType<TResult>(IEnumerable) |
根据指定类型筛选 IEnumerable 的元素。 |
AsParallel(IEnumerable) |
启用查询的并行化。 |
AsQueryable(IEnumerable) |
将 IEnumerable 转换为 IQueryable。 |
适用于
线程安全性
Visual Basic 中的公共静态 (Shared
) 此类型的成员是线程安全的。 但不保证所有实例成员都是线程安全的。
此实现不会为 ListDictionary提供同步 (线程安全) 包装器,但派生类可以使用 属性创建自己的同步版本的 ListDictionarySyncRoot 。
枚举整个集合本质上不是一个线程安全的过程。 即使某个集合已同步,其他线程仍可以修改该集合,这会导致枚举数引发异常。 若要确保枚举过程中的线程安全性,可以在整个枚举期间锁定集合,或者捕获由其他线程进行的更改所导致的异常。