如何从元素本身知道列表元素的索引?
例如,下面的代码将不起作用,因为“ s”没有名为index
的属性。但是,有没有一种简单的方法来获取索引?
我知道IndexOf()
和Find()
,但这不是我想要的东西。因为我们已经有了元素,所以应该像属性一样显示索引,对吧?
private List<string> myStr = ......
foreach (string s in myStr)
{
if (....)
{
return s.index;
}
}
答案 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 方面。