为什么对象不知道自己的索引?

Ken*_*Ken -3 c#

我们如何从元素本身知道列表元素的索引?

例如,下面的代码将不起作用,因为“s”没有名为 的属性index。但是有没有一种简单的方法来获取索引呢?

我知道IndexOf()Find()但这不是我要找的东西。因为我们已经有了元素,所以它应该是类似属性的东西来显示索引,对吧?

private List<string> myStr = ......

foreach (string s in myStr)
{
    if (....) 
    {
       return s.index;
    }
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*iho 5

我知道 IndexOf() 和 Find() 但这不是我要找的东西。因为我们已经有了元素,所以它应该是类似属性的东西来显示索引,对吧?

我理解为什么您可能认为这对于该语言来说是有用的。但是,事实并非如此。对于任何给定的对象类型,该对象的实例可以存在于包含或不存在包含该对象的集合的情况下。事实上,单个实例可能位于多个集合中。例如,如果我有这样的东西:

string[] a1 = { "1", "2", "3" }, a2 = { "2", "3", "4" };
string element = "3";
int i = element.Index;
Run Code Online (Sandbox Code Playgroud)

您期望 的价值是多少i?应该是2还是1

索引的确切需求根据集合及其中元素的使用方式而有所不同。通常,集合很小并且对索引的需求很少,因此集合的线性搜索就可以了。在其他情况下,仅在集合因其他原因已被迭代的同时才需要索引,因此索引自然可用。

在这些不适用并且需要立即检索索引的情况下,还有其他选项。例如,您可以初始化一个为您提供索引的字典:

string[] a = { "1", "2", "3" };
Dictionary<string, int> map1 =
    a.Select((s, i) => new { Key = s, Index = i }).ToDictionary(x => x.Key, x => x.Index);
string element = "3";
int i = map1[element];
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用装饰器模式或类似的策略将元素包装在一个对象中,该对象确实跟踪其在集合中的索引。

底线:C# 语言没有办法直接从该对象本身生成元素的索引,并且实际上无法以任何实际方式生成,因为任何元素都可以有两个或多个索引,甚至没有索引全部,具体取决于它包含在多少个集合中。在特定情况下,您可以使用其他替代方法来产生相同的结果。您对替代方案的选择将取决于每个场景的具体方面。