【发布时间】:2021-01-22 04:32:08
【问题描述】:
从C#版本8开始,有了indexing的新方式,如示例所示:
void Main()
{
Index idx = ^5; // counted from last to first element
var sentence = new string[]
{
"The", "quick", "brown", "fox", // position 0 ... 3
"jumped", "over", "the", "lazy", "dog" // position 4 ... 8
};
var lstSentence = sentence.ToList(); // applicable to list as well
Console.WriteLine(sentence[idx]);
Console.WriteLine(lstSentence[idx]);
}
它返回jumped。
到目前为止一切顺利。但是如何有效地获得代表^5 的绝对位置呢?
我看到 .NET 内部使用的是Index(我在这个例子中添加了它),并且有一个 value 属性。
如何获得sentence[^5] 的位置?
类似的东西
var absPos = sentence[^5].Index.Value; // get absolute position (which is = 4)
(但不幸的是,这似乎不存在)
我知道有一个公式(元素数 - 右起位置),但编译器/.net 会计算并可能将其存储在某处。
更新: idx.Value 不是解决方案,它只是将相对值 5 与 .IsFromEnd 一起存储,这是真的。但是你不能直接访问它,就像我想知道的sentence[^5].Index.Value。
注意:这对Dictionary 也很有用,如果您查看RudimentaryMultiValuedDictionary Example - 如果您想添加一个额外的索引器,如public List<TValue> this[Index idx],您将需要它。你需要的internalDictionary.ElementAtOrDefault(i) 仅适用于整数值(绝对位置)。
【问题讨论】:
-
^0 等于 sentence.Length 所以你的索引应该是 sentence.Length - 5 docs.microsoft.com/en-us/dotnet/csharp/whats-new/…
-
绝对位置是什么意思?
-
不,这是不可能的。没有语言功能可以告诉您这一点。
^5构造的字面意思是“从末尾返回 5”,索引是在数组索引期间评估的,您返回的是该索引处数组中插槽的内容,而不是知道它在数组中的位置的东西.您必须创建一个方法来模仿评估^5并为您返回索引的代码。 -
@Emanuele - 数组项的索引 - 在示例中为值 4。
-
@Matt 对您的最新评论的回答是否定的。它不被存储。
Index.GetOffset是您想要的方法。(^5).GetOffset(sentence.Length)会告诉你sentence的索引。
标签: c# arrays .net list dictionary