按索引获取列表项

457

我最近开始使用C#,从Java转换过来。我似乎找不到如何按索引获取列表项。在Java中,要获取列表的第一项:

list1.get(0);

C# 中的等价物是什么?


4
请参考https://dev59.com/P2435IYBdhLWcg3wlRMf,了解何时使用[]运算符或ElementAt()方法的讨论。 - ngm
1
@user1909486:你还没有接受任何答案回答你的问题。 - Mitch Wheat
6个回答

508
list1[0];

假设列表类型已定义索引器。


6
可以访问一个列表(即对象)就像访问数组一样,唯一的解释是: - PrashanD
1
它会返回列表中对象的副本吗? obj = list[0]; list.clear(); // obj仍然会被填充吗? - Paul McCarthy
4
@Paul McCarthy:你可以轻易地自行测试,但是答案是肯定的。一个列表保存了对对象的引用。清空列表并不会影响其中保存的对象。如果没有其他的引用指向这些对象,那么它们最终会被垃圾回收。 - Mitch Wheat

313
你可以在列表上使用ElementAt扩展方法。
例如:
// Get the first item from the list

using System.Linq;

var myList = new List<string>{ "Yes", "No", "Maybe"};
var firstItem = myList.ElementAt(0);

// Do something with firstItem

36
请注意,使用ElementAt()需要添加using System.Linq;命名空间。 - ngm
34
这种写法与标准的 myList[0] 写法相比,有什么优势吗? - AnalogWeapon
14
在使用IEnumerable集合时,为什么会用到Enumerable.ElementAt()而不是[]运算符? - Lavande
6
.ElementAtOrDefault(); - amit jha
6
@AnalogWeapon 是的,确实有这个功能 - 您可以将其用作空安全链的一部分,例如 myCollectionWhichMightBeNull?.ElementAt(0) 或者为了防范不存在的元素而保护:myCollection.ElementAtOrDefault(0)?.SomeProperty - Chris Peacock
显示剩余2条评论

43

Visual Basic、C#和C++都有访问Item属性的语法,而不使用其名称。相反,包含列表的变量被用作数组:

List[index]

例如,参见List.Item[Int32]属性


26

.NET的List数据结构是一个可变壳中的Array

因此,您可以使用索引访问其元素,例如:

var firstElement = myList[0];
var secondElement = myList[1];

C# 8.0开始,您可以使用IndexRange类来访问元素。它们提供了从序列末尾访问或仅访问序列特定部分的功能:

var lastElement = myList[^1]; // Using Index
var fiveElements = myList[2..7]; // Using Range, note that 7 is exclusive

您可以将索引和范围结合在一起使用:

var elementsFromThirdToEnd = myList[2..^0]; // Index and Range together

此外,您可以使用LINQ的ElementAt方法,但在99%的情况下,这真的不是必要的,只会导致性能变慢。


21

虽然这是一道老问题,但我看到这个帖子最近还是很活跃,所以我会加入我的两分钱:

基本上就像Mitch说的那样。假设索引正确,您可以像访问数组一样使用方括号表示法。除了使用数字索引之外,如果成员有特定名称,您通常可以通过输入类似以下内容的东西来进行一种同时搜索/访问:

var temp = list1["DesiredMember"];

你知道的越多,对吧?


18

你可以使用索引访问列表元素

List<string> list1 = new List<string>();
list1[0] //for getting the first element of the list

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接