IOrderedDictionary 接口 
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
表示键/值对的索引集合。
public interface class IOrderedDictionary : System::Collections::IDictionarypublic interface IOrderedDictionary : System.Collections.IDictionarytype IOrderedDictionary = interface
    interface ICollection
    interface IEnumerable
    interface IDictionarytype IOrderedDictionary = interface
    interface IDictionary
    interface ICollection
    interface IEnumerablePublic Interface IOrderedDictionary
Implements IDictionary- 派生
- 实现
示例
下面的代码示例演示了基于 ArrayList 类的简单 IOrderedDictionary 的实现。 实现 IOrderedDictionary 的 将名字存储为键,将姓氏存储为值,并额外要求每个名字都是唯一的。
#using <System.dll>
using namespace System;
using namespace System::Collections;
using namespace System::Collections::Specialized;
public ref class PeopleEnum : IDictionaryEnumerator
{
private:
    // Enumerators are positioned before the first element
    // until the first MoveNext() call.
    int position;
    ArrayList^ _people;
public:
    PeopleEnum(ArrayList^ list)
    {
        this->Reset();
        _people = list;
    }
    virtual bool MoveNext()
    {
        position++;
        return (position < _people->Count);
    }
    virtual void Reset()
    {
        position = -1;
    }
    virtual property Object^ Current
    {
        Object^ get()
        {
            try
            {
                return _people[position];
            }
            catch (IndexOutOfRangeException^)
            {
                throw gcnew InvalidOperationException();
            }
        }
    }
    virtual property DictionaryEntry Entry
    {
        DictionaryEntry get()
        {
            return (DictionaryEntry)(Current);
        }
    }
    virtual property Object^ Key
    {
        Object^ get()
        {
            try
            {
                return ((DictionaryEntry^)_people[position])->Key;
            }
            catch (IndexOutOfRangeException^)
            {
                throw gcnew InvalidOperationException();
            }
        }
    }
    virtual property Object^ Value
    {
        Object^ get()
        {
            try
            {
                return ((DictionaryEntry^)_people[position])->Value;
            }
            catch (IndexOutOfRangeException^)
            {
                throw gcnew InvalidOperationException();
            }
        }
    }
};
public ref class People : IOrderedDictionary
{
private:
    ArrayList^ _people;
public:
    People(int numItems)
    {
        _people = gcnew ArrayList(numItems);
    }
    int IndexOfKey(Object^ key)
    {
        for (int i = 0; i < _people->Count; i++)
        {
            if (((DictionaryEntry^)_people[i])->Key == key)
                return i;
        }
        // key not found, return -1.
        return -1;
    }
    virtual property Object^ default[Object^]
    {
        Object^ get(Object^ key)
        {
            return ((DictionaryEntry^)_people[IndexOfKey(key)])->Value;
        }
        void set(Object^ key, Object^ value)
        {
            _people[IndexOfKey(key)] = gcnew DictionaryEntry(key, value);
        }
    }
    // IOrderedDictionary Members
    virtual IDictionaryEnumerator^ GetEnumerator()
    {
        return gcnew PeopleEnum(_people);
    }
    virtual void Insert(int index, Object^ key, Object^ value)
    {
        if (IndexOfKey(key) != -1)
        {
            throw gcnew ArgumentException("An element with the same key already exists in the collection.");
        }
        _people->Insert(index, gcnew DictionaryEntry(key, value));
    }
    virtual void RemoveAt(int index)
    {
        _people->RemoveAt(index);
    }
    virtual property Object^ default[int]
    {
        Object^ get(int index)
        {
            return ((DictionaryEntry^)_people[index])->Value;
        }
        void set(int index, Object^ value)
        {
            Object^ key = ((DictionaryEntry^)_people[index])->Key;
            _people[index] = gcnew DictionaryEntry(key, value);
        }
    }
    // IDictionary Members
    virtual void Add(Object^ key, Object^ value)
    {
        if (IndexOfKey(key) != -1)
        {
            throw gcnew ArgumentException("An element with the same key already exists in the collection.");
        }
        _people->Add(gcnew DictionaryEntry(key, value));
    }
    virtual void Clear()
    {
        _people->Clear();
    }
    virtual bool Contains(Object^ key)
    {
        if (IndexOfKey(key) == -1)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    virtual property bool IsFixedSize
    {
        bool get()
        {
            return false;
        }
    }
    virtual property bool IsReadOnly
    {
        bool get()
        {
            return false;
        }
    }
    virtual property ICollection^ Keys
    {
        ICollection^ get()
        {
            ArrayList^ KeyCollection = gcnew ArrayList(_people->Count);
            for (int i = 0; i < _people->Count; i++)
            {
                KeyCollection->Add( ((DictionaryEntry^)_people[i])->Key );
            }
            return KeyCollection;
        }
    }
    virtual void Remove(Object^ key)
    {
        _people->RemoveAt(IndexOfKey(key));
    }
    virtual property ICollection^ Values
    {
        ICollection ^get()
        {
            ArrayList^ ValueCollection = gcnew ArrayList(_people->Count);
            for (int i = 0; i < _people->Count; i++)
            {
                ValueCollection->Add( ((DictionaryEntry^)_people[i])->Value );
            }
            return ValueCollection;
        }
    }
    // ICollection Members
    virtual void CopyTo(Array^ array, int index)
    {
        _people->CopyTo(array, index);
    }
    virtual property int Count
    {
        int get()
        {
            return _people->Count;
        }
    }
    virtual property bool IsSynchronized
    {
        bool get()
        {
            return _people->IsSynchronized;
        }
    }
    virtual property Object^ SyncRoot
    {
        Object^ get()
        {
            return _people->SyncRoot;
        }
    }
    // IEnumerable Members
    virtual IEnumerator^ IfcGetEnumerator() = IEnumerable::GetEnumerator
    {
        return (IEnumerator^) gcnew PeopleEnum(_people);
    }
};
class App
{
public:
    static void Main()
    {
        People^ peopleCollection = gcnew People(3);
        peopleCollection->Add("John", "Smith");
        peopleCollection->Add("Jim", "Johnson");
        peopleCollection->Add("Sue", "Rabon");
        Console::WriteLine("Displaying the entries in peopleCollection:");
        for each (DictionaryEntry^ de in peopleCollection)
        {
            Console::WriteLine("{0} {1}", de->Key, de->Value);
        }
        Console::WriteLine();
        Console::WriteLine("Displaying the entries in the modified peopleCollection:");
        peopleCollection["Jim"] = "Jackson";
        peopleCollection->Remove("Sue");
        peopleCollection->Insert(0, "Fred", "Anderson");
        for each (DictionaryEntry^ de in peopleCollection)
        {
            Console::WriteLine("{0} {1}", de->Key, de->Value);
        }
    }
};
int main()
{
    App::Main();
}
/* This code produces output similar to the following:
 *
 * Displaying the entries in peopleCollection:
 * John Smith
 * Jim Johnson
 * Sue Rabon
 *
 * Displaying the entries in the modified peopleCollection:
 * Fred Anderson
 * John Smith
 * Jim Jackson
 */
using System;
using System.Collections;
using System.Collections.Specialized;
public class People : IOrderedDictionary
{
    private ArrayList _people;
    public People(int numItems)
    {
        _people = new ArrayList(numItems);
    }
    public int IndexOfKey(object key)
    {
        for (int i = 0; i < _people.Count; i++)
        {
            if (((DictionaryEntry)_people[i]).Key == key)
                return i;
        }
        // key not found, return -1.
        return -1;
    }
    public object this[object key]
    {
        get
        {
            return ((DictionaryEntry)_people[IndexOfKey(key)]).Value;
        }
        set
        {
            _people[IndexOfKey(key)] = new DictionaryEntry(key, value);
        }
    }
    // IOrderedDictionary Members
    public IDictionaryEnumerator GetEnumerator()
    {
        return new PeopleEnum(_people);
    }
    public void Insert(int index, object key, object value)
    {
        if (IndexOfKey(key) != -1)
        {
            throw new ArgumentException("An element with the same key already exists in the collection.");
        }
        _people.Insert(index, new DictionaryEntry(key, value));
    }
    public void RemoveAt(int index)
    {
        _people.RemoveAt(index);
    }
    public object this[int index]
    {
        get
        {
            return ((DictionaryEntry)_people[index]).Value;
        }
        set
        {
            object key = ((DictionaryEntry)_people[index]).Key;
            _people[index] = new DictionaryEntry(key, value);
        }
    }
    // IDictionary Members
    public void Add(object key, object value)
    {
        if (IndexOfKey(key) != -1)
        {
            throw new ArgumentException("An element with the same key already exists in the collection.");
        }
        _people.Add(new DictionaryEntry(key, value));
    }
    public void Clear()
    {
        _people.Clear();
    }
    public bool Contains(object key)
    {
        if (IndexOfKey(key) == -1)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    public bool IsFixedSize
    {
        get
        {
            return false;
        }
    }
    public bool IsReadOnly
    {
        get
        {
            return false;
        }
    }
    public ICollection Keys
    {
        get
        {
            ArrayList KeyCollection = new ArrayList(_people.Count);
            for (int i = 0; i < _people.Count; i++)
            {
                KeyCollection.Add( ((DictionaryEntry)_people[i]).Key );
            }
            return KeyCollection;
        }
    }
    public void Remove(object key)
    {
        _people.RemoveAt(IndexOfKey(key));
    }
    public ICollection Values
    {
        get
        {
            ArrayList ValueCollection = new ArrayList(_people.Count);
            for (int i = 0; i < _people.Count; i++)
            {
                ValueCollection.Add( ((DictionaryEntry)_people[i]).Value );
            }
            return ValueCollection;
        }
    }
    // ICollection Members
    public void CopyTo(Array array, int index)
    {
        _people.CopyTo(array, index);
    }
    public int Count
    {
        get
        {
            return _people.Count;
        }
    }
    public bool IsSynchronized
    {
        get
        {
            return _people.IsSynchronized;
        }
    }
    public object SyncRoot
    {
        get
        {
            return _people.SyncRoot;
        }
    }
    // IEnumerable Members
    IEnumerator IEnumerable.GetEnumerator()
    {
        return new PeopleEnum(_people);
    }
}
public class PeopleEnum : IDictionaryEnumerator
{
    public ArrayList _people;
    // Enumerators are positioned before the first element
    // until the first MoveNext() call.
    int position = -1;
    public PeopleEnum(ArrayList list)
    {
        _people = list;
    }
    public bool MoveNext()
    {
        position++;
        return (position < _people.Count);
    }
    public void Reset()
    {
        position = -1;
    }
    public object Current
    {
        get
        {
            try
            {
                return _people[position];
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }
    public DictionaryEntry Entry
    {
        get
        {
            return (DictionaryEntry)Current;
        }
    }
    public object Key
    {
        get
        {
            try
            {
                return ((DictionaryEntry)_people[position]).Key;
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }
    public object Value
    {
        get
        {
            try
            {
                return ((DictionaryEntry)_people[position]).Value;
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }
}
class App
{
    static void Main()
    {
        People peopleCollection = new People(3);
        peopleCollection.Add("John", "Smith");
        peopleCollection.Add("Jim", "Johnson");
        peopleCollection.Add("Sue", "Rabon");
        Console.WriteLine("Displaying the entries in peopleCollection:");
        foreach (DictionaryEntry de in peopleCollection)
        {
            Console.WriteLine("{0} {1}", de.Key, de.Value);
        }
        Console.WriteLine();
        Console.WriteLine("Displaying the entries in the modified peopleCollection:");
        peopleCollection["Jim"] = "Jackson";
        peopleCollection.Remove("Sue");
        peopleCollection.Insert(0, "Fred", "Anderson");
        foreach (DictionaryEntry de in peopleCollection)
        {
            Console.WriteLine("{0} {1}", de.Key, de.Value);
        }
    }
}
/* This code produces output similar to the following:
 *
 * Displaying the entries in peopleCollection:
 * John Smith
 * Jim Johnson
 * Sue Rabon
 *
 * Displaying the entries in the modified peopleCollection:
 * Fred Anderson
 * John Smith
 * Jim Jackson
 */
Imports System.Collections
Imports System.Collections.Specialized
Public Class People
    Implements IOrderedDictionary
    Private _people As ArrayList
    Public Sub New(ByVal numItems As Integer)
        _people = New ArrayList(numItems)
    End Sub
    Public Function IndexOfKey(ByVal key As Object) As Integer
        Dim i As Integer
        For i = 0 To _people.Count - 1
            If CType(_people(i), DictionaryEntry).Key = key Then
                Return i
            End If
        Next i
        ' key not found, return -1.
        Return -1
    End Function
    ' IOrderedDictionary Members
    Public Function GetEnumerator() As IDictionaryEnumerator _
        Implements IOrderedDictionary.GetEnumerator
        Return New PeopleEnum(_people)
    End Function
    Public Sub Insert(ByVal index As Integer, ByVal key As Object, _
        ByVal value As Object) Implements IOrderedDictionary.Insert
        If Not IndexOfKey(key) = -1 Then
            Throw New ArgumentException("An element with the same key already exists in the collection.")
        End If
        _people.Insert(index, New DictionaryEntry(key, value))
    End Sub
    Public Sub RemoveAt(ByVal index As Integer) _
        Implements IOrderedDictionary.RemoveAt
        _people.RemoveAt(index)
    End Sub
    Public Property Item(ByVal index As Integer) As Object _
        Implements IOrderedDictionary.Item
        Get
            Return CType(_people(index), DictionaryEntry).Value
        End Get
        Set(ByVal value As Object)
            Dim key As Object = CType(_people(index), DictionaryEntry).Key
            _people(index) = New DictionaryEntry(key, value)
        End Set
    End Property
    ' IDictionary Members
    Public Function IDictionaryGetEnumerator() As IDictionaryEnumerator _
    Implements IDictionary.GetEnumerator
        Return New PeopleEnum(_people)
    End Function
    Public Property Item(ByVal key As Object) As Object _
        Implements IDictionary.Item
        Get
            Return CType(_people(IndexOfKey(key)), DictionaryEntry).Value
        End Get
        Set(ByVal value)
            _people(IndexOfKey(key)) = New DictionaryEntry(key, value)
        End Set
    End Property
    Public Sub Add(ByVal key As Object, ByVal value As Object) _
        Implements IDictionary.Add
        If Not IndexOfKey(key) = -1 Then
            Throw New ArgumentException("An element with the same key already exists in the collection.")
        End If
        _people.Add(New DictionaryEntry(key, value))
    End Sub
    Public Sub Clear() Implements IDictionary.Clear
        _people.Clear()
    End Sub
    Public Function Contains(ByVal key As Object) As Boolean _
        Implements IDictionary.Contains
        If IndexOfKey(key) = -1 Then
            Return False
        Else
            Return True
        End If
    End Function
    Public ReadOnly Property IsFixedSize() As Boolean _
        Implements IDictionary.IsFixedSize
        Get
            Return False
        End Get
    End Property
    Public ReadOnly Property IsReadOnly() As Boolean _
        Implements IDictionary.IsReadOnly
        Get
            Return False
        End Get
    End Property
    Public ReadOnly Property Keys() As ICollection _
        Implements IDictionary.Keys
        Get
            Dim KeyCollection As ArrayList = New ArrayList(_people.Count)
            Dim i As Integer
            For i = 0 To _people.Count - 1
                KeyCollection.Add( CType(_people(i), DictionaryEntry).Key )
            Next i
            Return KeyCollection
        End Get
    End Property
    Public Sub Remove(ByVal key As Object) _
        Implements IDictionary.Remove
        _people.RemoveAt(IndexOfKey(key))
    End Sub
    Public ReadOnly Property Values() As ICollection _
        Implements IDictionary.Values
        Get
            Dim ValueCollection As ArrayList = New ArrayList(_people.Count)
            Dim i As Integer
            For i = 0 To _people.Count - 1
                ValueCollection.Add( CType(_people(i), DictionaryEntry).Value )
            Next i
            Return ValueCollection
        End Get
    End Property
    ' ICollection Members
    Public Sub CopyTo(ByVal array As Array, ByVal index As Integer) _
    Implements ICollection.CopyTo
        _people.CopyTo(Array, index)
    End Sub
    Public ReadOnly Property Count() As Integer _
        Implements ICollection.Count
        Get
            Return _people.Count
        End Get
    End Property
    Public ReadOnly Property IsSynchronized() As Boolean _
        Implements ICollection.IsSynchronized
        Get
            Return _people.IsSynchronized
        End Get
    End Property
    Public ReadOnly Property SyncRoot() As Object _
        Implements ICollection.SyncRoot
        Get
            Return _people.SyncRoot
        End Get
    End Property
    ' IEnumerable Members
    Public Function IEnumerableGetEnumerator() As IEnumerator _
        Implements IEnumerable.GetEnumerator
        Return New PeopleEnum(_people)
    End Function
End Class
Public Class PeopleEnum
    Implements IDictionaryEnumerator
    Public _people As ArrayList
    ' Enumerators are positioned before the first element
    ' until the first MoveNext() call.
    Dim position As Integer = -1
    Public Sub New(ByVal list As ArrayList)
        _people = list
    End Sub
    Public Function MoveNext() As Boolean _
        Implements IEnumerator.MoveNext
        position = position + 1
        Return (position < _people.Count)
    End Function
    Public Sub Reset() _
        Implements IEnumerator.Reset
        position = -1
    End Sub
    Public ReadOnly Property Current() As Object _
        Implements IEnumerator.Current
        Get
            Try
                Return _people(position)
            Catch e As IndexOutOfRangeException
                Throw New InvalidOperationException()
            End Try
        End Get
    End Property
    Public ReadOnly Property Entry() As DictionaryEntry _
        Implements IDictionaryEnumerator.Entry
        Get
            Return CType(Current, DictionaryEntry)
        End Get
    End Property
    Public ReadOnly Property Key() As Object _
        Implements IDictionaryEnumerator.Key
        Get
            Try
                Return CType(_people(position), DictionaryEntry).Key
            Catch e As IndexOutOfRangeException
                Throw New InvalidOperationException()
            End Try
        End Get
    End Property
    Public ReadOnly Property Value() As Object _
        Implements IDictionaryEnumerator.Value
        Get
            Try
                Return CType(_people(position), DictionaryEntry).Value
            Catch e As IndexOutOfRangeException
                Throw New InvalidOperationException()
            End Try
        End Get
    End Property
End Class
Class App
    Shared Sub Main()
        Dim peopleCollection As People = New People(3)
        peopleCollection.Add("John", "Smith")
        peopleCollection.Add("Jim", "Johnson")
        peopleCollection.Add("Sue", "Rabon")
        Console.WriteLine("Displaying the entries in peopleCollection:")
        Dim de As DictionaryEntry
        For Each de In peopleCollection
            Console.WriteLine("{0} {1}", de.Key, de.Value)
        Next
        Console.WriteLine()
        Console.WriteLine("Displaying the entries in the modified peopleCollection:")
        'peopleCollection("Jim") = "Jackson"
        peopleCollection.Remove("Sue")
        peopleCollection.Insert(0, "Fred", "Anderson")
        For Each de In peopleCollection
            Console.WriteLine("{0} {1}", de.Key, de.Value)
        Next
    End Sub
End Class
' This code produces output similar to the following:
' 
' Displaying the entries in peopleCollection:
' John Smith
' Jim Johnson
' Sue Rabon
' 
' Displaying the entries in the modified peopleCollection:
' Fred Anderson
' John Smith
' Jim Jackson
注解
IOrderedDictionary 可以使用 键或索引访问 元素。
每个元素都是存储在 结构中的 DictionaryEntry 键/值对。
每对必须有一个不 null为 的唯一键,但值可以是 null ,不必是唯一的。 接口 IOrderedDictionary 允许枚举包含的键和值,但它并不表示任何特定的排序顺序。
              foreach Visual Basic) For Each 中 C# 语言 (语句返回集合中元素类型的对象。 由于 的每个 IDictionary 元素都是键/值对,因此元素类型不是键的类型或值的类型。 相反,元素类型为 DictionaryEntry,如以下示例所示。
for each (DictionaryEntry de in myOrderedDictionary)
{
    //...
}
foreach (DictionaryEntry de in myOrderedDictionary)
{
    //...
}
For Each de In myOrderedDictionary
    '...
Next
语句 foreach 是枚举器的包装器,它只允许从集合读取,而不允许写入集合。
实施者说明
实现类必须具有比较键的方法。
属性
| Count | 获取 ICollection 中包含的元素数。(继承自 ICollection) | 
| IsFixedSize | 获取一个值,该值指示 IDictionary 对象是否具有固定大小。(继承自 IDictionary) | 
| IsReadOnly | 获取一个值,该值指示 IDictionary 对象是否为只读。(继承自 IDictionary) | 
| IsSynchronized | 获取一个值,该值指示是否同步对 ICollection 的访问(线程安全)。(继承自 ICollection) | 
| Item[Int32] | 获取或设置指定索引处的元素。 | 
| Item[Object] | 获取或设置具有指定键的元素。(继承自 IDictionary) | 
| Keys | 获取 ICollection 对象,它包含 IDictionary 对象的键。(继承自 IDictionary) | 
| SyncRoot | 获取可用于同步对 ICollection 的访问的对象。(继承自 ICollection) | 
| Values | 获取 ICollection 对象,它包含 IDictionary 对象中的值。(继承自 IDictionary) | 
方法
| Add(Object, Object) | 在 IDictionary 对象中添加一个带有所提供的键和值的元素。(继承自 IDictionary) | 
| Clear() | 从 IDictionary 对象中移除所有元素。(继承自 IDictionary) | 
| Contains(Object) | 确定 IDictionary 对象是否包含具有指定键的元素。(继承自 IDictionary) | 
| CopyTo(Array, Int32) | 从特定的 ICollection 索引开始,将 Array 的元素复制到一个 Array 中。(继承自 ICollection) | 
| GetEnumerator() | 返回一个循环访问 IOrderedDictionary 集合的枚举数。 | 
| Insert(Int32, Object, Object) | 将键/值对插入到指定索引处的集合中。 | 
| Remove(Object) | 从 IDictionary 对象中移除具有指定键的元素。(继承自 IDictionary) | 
| RemoveAt(Int32) | 移除指定索引处的元素。 | 
扩展方法
| Cast<TResult>(IEnumerable) | 将 IEnumerable 的元素强制转换为指定的类型。 | 
| OfType<TResult>(IEnumerable) | 根据指定类型筛选 IEnumerable 的元素。 | 
| AsParallel(IEnumerable) | 启用查询的并行化。 | 
| AsQueryable(IEnumerable) | 将 IEnumerable 转换为 IQueryable。 |