• c#的IList,IEnumerable和IEnumerator


    IListICollection 接口的子代,并且是所有非泛型列表的基接口。IList 实现有三种类别:只读、固定大小和可变大小。无法修改只读 IList。固定大小的 IList 不允许添加或移除元素,但允许修改现有元素。可变大小的 IList 允许添加、移除和修改元素。

     

    下面的示例演示创建一个简单列表——固定大小列表的 IList 接口的实现。

     

    代码

    class SimpleList : IList
    {
       
    private object[] _contents = new object[8];
       
    private int _count;

       
    public SimpleList()
       {
          _count 
    = 0;
       }

       
    // IList Members
       public int Add(object value)
       {
          
    if (_count < _contents.Length)
          {
             _contents[_count] 
    = value;
             _count
    ++;

             
    return (_count - 1);
          }
          
    else
          {
             
    return -1;
          }
       }

       
    public void Clear()
       {
          _count 
    = 0;
       }

       
    public bool Contains(object value)
       {
          
    bool inList = false;
          
    for (int i = 0; i < Count; i++)
          {
             
    if (_contents[i] == value)
             {
                inList 
    = true;
                
    break;
             }
          }
          
    return inList;
       }

       
    public int IndexOf(object value)
       {
          
    int itemIndex = -1;
          
    for (int i = 0; i < Count; i++)
          {
             
    if (_contents[i] == value)
             {
                itemIndex 
    = i;
                
    break;
             }
          }
          
    return itemIndex;
       }

       
    public void Insert(int index, object value)
       {
          
    if ((_count + 1 <= _contents.Length) && (index < Count) && (index >= 0))
          {
             _count
    ++;

             
    for (int i = Count - 1; i > index; i--)
             {
                _contents[i] 
    = _contents[i - 1];
             }
             _contents[index] 
    = value;
          }
       }

       
    public bool IsFixedSize
       {
          
    get
          {
             
    return true;
          }
       }

       
    public bool IsReadOnly
       {
          
    get
          {
             
    return false;
          }
       }

       
    public void Remove(object value)
       {
          RemoveAt(IndexOf(value));
       }

       
    public void RemoveAt(int index)
       {
          
    if ((index >= 0&& (index < Count))
          {
             
    for (int i = index; i < Count - 1; i++)
             {
                _contents[i] 
    = _contents[i + 1];
             }
             _count
    --;
          }
       }

       
    public object this[int index]
       {
          
    get
          {
             
    return _contents[index];
          }
          
    set
          {
             _contents[index] 
    = value;
          }
       }

       
    // ICollection Members

       
    public void CopyTo(Array array, int index)
       {
          
    int j = index;
          
    for (int i = 0; i < Count; i++)
          {
             array.SetValue(_contents[i], j);
             j
    ++;
          }
       }

       
    public int Count
       {
          
    get
          {
             
    return _count;
          }
       }

       
    public bool IsSynchronized
       {
          
    get
          {
             
    return false;
          }
       }

       
    // Return the current instance since the underlying store is not
       
    // publicly available.
       public object SyncRoot
       {
          
    get
          {
             
    return this;
          }
       }

       
    // IEnumerable Members

       
    public IEnumerator GetEnumerator()
       {
          
    // Refer to the IEnumerator documentation for an example of
          
    // implementing an enumerator.
          throw new Exception("The method or operation is not implemented.");
       }

       
    public void PrintContents(System.Windows.Controls.TextBlock outputBlock)
       {
          outputBlock.Text 
    += String.Format("List has a capacity of {0} and currently has {1} elements.", _contents.Length, _count) + "\n";
          outputBlock.Text 
    += "List contents:";
          
    for (int i = 0; i < Count; i++)
          {
             outputBlock.Text 
    += String.Format(" {0}", _contents[i]);
          }
          outputBlock.Text 
    += "\n";
       }
    }

     

     

    下面的代码示例演示如何实现自定义集合的 IEnumerableIEnumerator 接口。在此示例中,没有显式调用这些接口的成员,但实现了它们,以便支持使用 foreach循环访问该集合。

    代码
    using System;
    using System.Collections;

    public class Person
    {
       
    public Person(string fName, string lName)
       {
          
    this.firstName = fName;
          
    this.lastName = lName;
       }

       
    public string firstName;
       
    public string lastName;
    }

    public class People : IEnumerable
    {
       
    private Person[] _people;
       
    public People(Person[] pArray)
       {
          _people 
    = new Person[pArray.Length];

          
    for (int i = 0; i < pArray.Length; i++)
          {
             _people[i] 
    = pArray[i];
          }
       }

       
    public IEnumerator GetEnumerator()
       {
          
    return new PeopleEnum(_people);
       }
    }

    public class PeopleEnum : IEnumerator
    {
       
    public Person[] _people;

       
    // Enumerators are positioned before the first element
       
    // until the first MoveNext() call.
       int position = -1;

       
    public PeopleEnum(Person[] list)
       {
          _people 
    = list;
       }

       
    public bool MoveNext()
       {
          position
    ++;
          
    return (position < _people.Length);
       }

       
    public void Reset()
       {
          position 
    = -1;
       }

       
    public object Current
       {
          
    get
          {
             
    try
             {
                
    return _people[position];
             }
             
    catch (IndexOutOfRangeException)
             {
                
    throw new InvalidOperationException();
             }
          }
       }
    }

    class Example
    {
       
    public static void Demo(System.Windows.Controls.TextBlock outputBlock)
       {
          Person[] peopleArray 
    = new Person[3]
            {
                
    new Person("John""Smith"),
                
    new Person("Jim""Johnson"),
                
    new Person("Sue""Rabon"),
            };

          People peopleList 
    = new People(peopleArray);
          
    foreach (Person p in peopleList)
             outputBlock.Text 
    += p.firstName + " " + p.lastName + "\n";

       }
    }

    /* This code produces output similar to the following:
     * 
     * John Smith
     * Jim Johnson
     * Sue Rabon
     * 
     
    */

     

  • 相关阅读:
    CSS实例:图片导航块
    导航,头部,CSS基础
    web基础,用html元素制作web页面
    web基础
    timestamp与timedelta,管理信息系统概念与基础
    datetime处理日期和时间
    中文词频统计
    文件方式实现完整的英文词频统计实例
    当你发现任务管理器打不开
    恶搞关机
  • 原文地址:https://www.cnblogs.com/Fskjb/p/1736383.html
Copyright © 2020-2023  润新知