c#索引器介绍|C#索引器写法|c#索引器例子

本文详细介绍了C#中的索引器概念及其使用方法。索引器是一种特殊属性,允许对象像数组一样被索引。文章通过示例展示了索引器的定义与应用,包括get和set访问器的作用及索引器重载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  索引器就是特殊的属性,以下是最简单的索引器例子

就是给定索引编号去找索引编号对应的值,类似属性的数组

 public string this[string configName]
        {
            get
            {
                return System.Configuration.ConfigurationManager.AppSettings[configName];
            }

        }

 

索引器使得对象可按照与数组相似的方法进行索引。

get 访问器返回值。set 访问器分配值。

this 关键字用于定义索引器。

value 关键字用于定义由 set 索引器分配的值。

索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。

索引器可被重载。

索引器可以有多个形参,例如当访问二维数组时。

C#语言一个最令人感兴趣的地方就是类的索引器(indexer)。简单说来,所谓索引器就是一类特殊的属性,通过它们你就可以像引用数组一样引用自己的类。显然,这一功能在创建集合类的场合特别有用,而在其他某些情况下,比如处理大型文件或者抽象某些有限资源等,能让类具有类似数组的行为当然也是非常有用的。本文就会引领你设置类来采用索引器。但是,首先让我们概述下属性这个概念以便了解些必要的背景知识。

属性

  假如你曾经用VB6编写过程序,那么你应该很熟悉属性方法才对,所谓属性方法其实就是特殊的类成员,它实现了对私有类域的受控访问。在C#语言中有两种属性方法,其一是get,通过它可以返回私有域的值,其二是set,通过它就可以设置私有域的值。比如说,以下面的代码为例,其间创建了一个FirstName属性,由它控制对私有类成员firstname的访问:

class Person {
private string firstname;
public string FirstName {
get {return firstname;}
set {firstname = value;}
}
}

属性声明可以如下编码:
Person p = new Person();
p.FirstName = "Lamont";
Console.WriteLine (p.FirstName);

  如你你所看到的那样,属性声明倒更像是域声明,只不过它还声明了两个特殊的成员,按照微软的说法就是所谓的访问函数(accessor)。当某一表达式的右边调用属性或者属性用作其他子程序(或者函数)的参数时即会调用get访问函数。反之,当表达式左边调用属性并且通过隐式传递value参数设置私有域值的情况下就会调用set访问函数。你可以创建只读属性,方法是省略set访问函数,这样任何设置属性的尝试都会产生编译错误。

采用索引器的益处

  说了半天咱们转到正题上来,那么为什么我要兜这个圈子呢?其实,这是因为类的索引器非常像属性,从代码上看也是这样。以下是具有索引器的类示例,通过索引器会返回一个字符串:

class Sample {
public string this [int index] {
get {return "You passed " + index; }
}
}

  注意,这里的属性名是this,意思是回引类的当前实例,参数列表包含在方括号而非括号之内。还有,这是一个只读索引器。为了把它改成读/写类型,我又添加了一个set访问函数。在定义索引器的时候,你不一定只采用一个参数。索引器参数可以采用任何类型,不过int是通常采用也是最为合理的类型。同一类中还可能拥有一个以上的索引器(重载)。

  如上定义了Sample类之后,我们就可以把索引器用作某种默认的属性,如下所示:

Sample s = new Sample();
Console.WriteLine(s[55]);

属性和索引器

   属性和索引器之间有好些差别:

  类的每一个属性都必须拥有唯一的名称,而类里定义的每一个索引器都必须拥有唯一的签名(signature)或者参数列表(这样就可以实现索引器重载)。

   属性可以是static(静态的)而索引器则必须是实例成员。

  为索引器定义的访问函数可以访问传递给索引器的参数,而属性访问函数则没有参数。

接口

  类似数组的行为常受到程序实现者的喜爱,所以你还可以为接口定义索引器,IList和 IDictionary集合接口都声明了索引器以便访问其存储的项目。

  在为接口声明索引器的时候,记住声明只是表示索引器的存在。你只需要提供恰当的访问函数即可,不必包括范围修饰符。以下代码把索引器声明为接口IImplementMe的一部分:

interface IImplementMe {
string this[int index]
{
get;
set;
}

  相应实现的类则必须为IimplementMe的索引器具体定义get和set访问函数。

  以上就是有关索引器的一些基本概述了。现在你应该对索引器在你的开发中所具有的作用有了较深入的了解。

索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。

在下面的示例中,定义了一个泛型类,并为其提供了简单的 get 和 set 访问器方法(作为分配和检索值的方法)。Program 类为存储字符串创建了此类的一个实例。

class SampleCollection<T>
{
    private T[] arr = new T[100];
    public T this[int i]
    {
        get
        {
            return arr[i];
        }
        set
        {
            arr[i] = value;
        }
    }
}

// This class shows how client code uses the indexer
class Program
{
    static void Main(string[] args)
    {
        SampleCollection<string> stringCollection = new SampleCollection<string>();
        stringCollection[0] = "Hello, World";
        System.Console.WriteLine(stringCollection[0]);

转载于:https://www.cnblogs.com/bestsaler/archive/2009/03/20/1835737.html

<think>好的,我需要回答用户在C#中如何获取string[]数组元素的索引。首先,用户的问题明确,他们想知道在C#中如何找到数组中某个元素的索引。我需要确保回答准确且涵盖多种方法。 首先,我应该回忆一下C#中数组的基本操作。数组本身提供了IndexOf方法,但需要转换成Array类来使用。例如,Array.IndexOf(array, element)。这可能是一个直接的方法。 接下来,用户提供的引用中,引用[4]提到了使用Array.FindIndex方法,这是一个更灵活的方法,可以处理条件查找。例如,查找满足某个条件的元素,而不仅仅是直接匹配。这可能适用于更复杂的情况,比如不区分大小写的查找。 另外,用户提到的是string数组,所以可能需要考虑字符串比较的方式。比如,使用StringComparison参数来指定是否区分大小写。这时候,FindIndex方法会更合适,因为它允许传入一个谓词。 还需要考虑当元素不存在时的情况,这些方法会返回-1,应该提醒用户进行错误处理,避免索引越界。 此外,用户可能想知道循环遍历的方法,虽然效率不高,但在某些情况下可能有用。例如,手动使用for循环遍历数组,逐个比较元素,然后返回索引。这在教学或理解原理时可能有帮助。 另外,引用[3]提到了foreach循环,但指出foreach只能读取元素,无法直接获取索引。因此,如果需要索引,应该使用for循环而不是foreach。这也需要向用户说明,避免混淆。 需要确保示例代码正确,比如Array.IndexOf的正确用法,以及FindIndex的lambda表达式写法。例如,Array.FindIndex(arr, s => s.Equals("目标值", StringComparison.OrdinalIgnoreCase))。 可能还需要比较不同方法的优缺点。比如,Array.IndexOf简单直接,但不支持自定义条件;FindIndex灵活但需要写谓词;手动循环可控但代码量多。 最后,总结不同方法的适用场景,帮助用户根据具体情况选择合适的方法。同时,提醒异常处理和性能考虑,比如大数组时的效率问题。</think>在C#中获取string[]数组元素索引的常用方法有以下几种: ### 方法1:Array.IndexOf静态方法 ```csharp string[] languages = {"CSharp", "ASP.NET", "Python", "Java"}; int index = Array.IndexOf(languages, "Python"); // 返回2 ``` - 特点:直接匹配元素值 - 注意:区分大小写,未找到返回-1 - 扩展用法:`Array.IndexOf(array, value, startIndex, count)`支持范围搜索[^1] ### 方法2:Array.FindIndex(条件查找) ```csharp int index = Array.FindIndex(languages, s => s.Equals("python", StringComparison.OrdinalIgnoreCase)); ``` - 特点:支持自定义匹配条件 - 优势:可实现不区分大小写等复杂匹配[^2] ### 方法3:手动遍历(适合特殊需求) ```csharp for(int i=0; i<languages.Length; i++){ if(languages[i] == "Java") { Console.WriteLine($"找到Java,索引:{i}"); break; } } ``` - 特点:完全控制比较逻辑 - 注意:需自行处理未找到的情况[^3] ### 错误处理建议 ```csharp int index = Array.IndexOf(languages, "Ruby"); if(index != -1){ // 找到时的处理 } else { Console.WriteLine("元素不存在"); } ``` ### 性能对比 | 方法 | 时间复杂度 | 适用场景 | |------|------------|----------| | IndexOf | O(n) | 简单精确匹配 | | FindIndex | O(n) | 需要自定义条件 | | 手动遍历 | O(n) | 需要特殊处理逻辑 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值