欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#索引属性用法实例分析

程序员文章站 2023-11-06 08:02:51
本文实例讲述了c#索引属性的用法。分享给大家供大家参考。具体如下: 这里演示c#类如何声明索引属性以表示不同种类事物的类似数组的集合。 // indexedpr...

本文实例讲述了c#索引属性的用法。分享给大家供大家参考。具体如下:

这里演示c#类如何声明索引属性以表示不同种类事物的类似数组的集合。

// indexedproperty.cs
using system;
public class document
{
  // 以下类型允许文档的查看方式与字的数组一样:
  public class wordcollection
  {
    readonly document document; // 包含文档
    internal wordcollection(document d)
    {
      document = d;
    }
    // helper 函数 -- 从字符“begin”开始在字符数组“text”中搜索
    // 字数“wordcount”。如果字数小于 wordcount,
    // 则返回 false。将“start”和
    // “length”设置为单词在文本中的位置和长度:
    private bool getword(char[] text, int begin, int wordcount, out int start, out int length) 
    { 
      int end = text.length;
      int count = 0;
      int inword = -1;
      start = length = 0; 
      for (int i = begin; i <= end; ++i) 
      {
        bool isletter = i < end && char.isletterordigit(text[i]);
        if (inword >= 0) 
        {
          if (!isletter) 
          {
            if (count++ == wordcount) 
            {
              start = inword;
              length = i - inword;
              return true;
            }
            inword = -1;
          }
        }
        else 
        {
          if (isletter)
            inword = i;
        }
      }
      return false;
    }
    // 获取和设置包含文档中的字的索引器:
    public string this[int index] 
    {
      get 
      { 
        int start, length;
        if (getword(document.textarray, 0, index, out start, out length))
          return new string(document.textarray, start, length);
        else
          throw new indexoutofrangeexception();
      }
      set 
      {
        int start, length;
        if (getword(document.textarray, 0, index, out start, out length)) 
        {
          // 用字符串“value”替换位于 start/length 处的
          // 字:
          if (length == value.length) 
          {
            array.copy(value.tochararray(), 0, document.textarray, start, length);
          }
          else 
          {
            char[] newtext = 
              new char[document.textarray.length + value.length - length];
            array.copy(document.textarray, 0, newtext, 0, start);
            array.copy(value.tochararray(), 0, newtext, start, value.length);
            array.copy(document.textarray, start + length, newtext, start + value.length, document.textarray.length - start - length);
            document.textarray = newtext;
          }
        }          
        else
          throw new indexoutofrangeexception();
      }
    }
    // 获取包含文档中字的计数:
    public int count 
    {
      get 
      { 
        int count = 0, start = 0, length = 0;
        while (getword(document.textarray, start + length, 0, out start, out length))
          ++count;
        return count; 
      }
    }
  }
  // 以下类型允许文档的查看方式像字符的“数组”
  // 一样:
  public class charactercollection
  {
    readonly document document; // 包含文档
    internal charactercollection(document d)
    {
     document = d; 
    }
    // 获取和设置包含文档中的字符的索引器:
    public char this[int index] 
    {
      get 
      { 
        return document.textarray[index]; 
      }
      set 
      { 
        document.textarray[index] = value; 
      }
    }
    // 获取包含文档中字符的计数:
    public int count 
    {
      get 
      { 
        return document.textarray.length; 
      }
    }
  }
  // 由于字段的类型具有索引器,
  // 因此这些字段显示为“索引属性”:
  public wordcollection words;
  public charactercollection characters;
  private char[] textarray; // 文档的文本。
  public document(string initialtext)
  {
    textarray = initialtext.tochararray();
    words = new wordcollection(this);
    characters = new charactercollection(this);
  }
  public string text 
  {
    get 
    { 
      return new string(textarray); 
    }
  }
}
class test
{
  static void main()
  {
    document d = new document(
      "peter piper picked a peck of pickled peppers. how many pickled peppers did peter piper pick?"
    );
    // 将字“peter”更改为“penelope”:
    for (int i = 0; i < d.words.count; ++i) 
    {
      if (d.words[i] == "peter") 
        d.words[i] = "penelope";
    }
    // 将字符“p”更改为“p”
    for (int i = 0; i < d.characters.count; ++i) 
    {
      if (d.characters[i] == 'p')
        d.characters[i] = 'p';
    }
    console.writeline(d.text);
  }
}

希望本文所述对大家的c#程序设计有所帮助。