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

时间:2020-05-16 22:25:07

标签: c#

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

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

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

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

foreach (string s in myStr)
{
    if (....) 
    {
       return s.index;
    }
}

1 个答案:

答案 0 :(得分:4)

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

我理解您为什么会认为这对于包含该语言是有用的。但是,事实并非如此。对于任何给定的对象类型,该对象的实例可以存在,也可以不包含可能包含该对象的集合。实际上,一个实例可以在多个集合中。例如,如果我有这样的内容:

string[] a1 = { "1", "2", "3" }, a2 = { "2", "3", "4" };
string element = "3";
int i = element.Index;

您期望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];

或者,您可以使用Decorator Pattern或类似策略将元素包装在确实跟踪其在集合中的索引的对象中。

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