C#在特定索引

时间:2015-10-16 19:52:50

标签: c#

让我们考虑这段C#代码:

     List<string> a = new List<string>();
     a.Add("word1");
     a.Add("word2");

现在假设我想要“word3”而不是word2。我可以说

     a[1]="word2";

但如果我尝试

     a.ElementAt(2) ="word2"; 

然后我得到一个错误,说左侧必须是变量。

此语法对引用类型和值类型的行为方式相同。 有人可以解释为什么第二种语法存在缺陷吗?

6 个答案:

答案 0 :(得分:5)

这是一个返回值的方法调用:

a.ElementAt(2)

您可以将值存储在变量中,并为该变量指定其他值。但无法将方法调用本身分配给。方法调用不是可以为其分配值的容器。

数组索引器直接引用数组(集合)变量中的元素,您可以为其赋值。方法调用没有引用任何内容,它返回的东西。

所以你可以分配一个变量:

x = "some value";

甚至是集合变量的索引:

x[0] = "some value";

但不是方法调用:

SomeMethod() = "some value";

答案 1 :(得分:1)

ElementAt是一种方法,您无法为其指定值。

您可以使用它的返回值,它返回序列中指定索引处的元素:

var x= a.ElementAt(0);

答案 2 :(得分:0)

 a.ElementAt(2) ="word2"; 

在这里,您调用方法并获取结果,然后尝试分配结果。不允许。如果你有这个:

var foo = a.ElementAt(2);
foo = "word2";
那时没关系。

当你使用a[1]="word2";时,会发生一些语法糖。您正在调用列表中的方法,而不是简单的赋值。请注意,根据列表的实现方式,按索引访问元素可能是一项昂贵的操作。

简而言之,使用固定长度列表的数组,列出可以改变大小的集合。

答案 3 :(得分:0)

=是一个赋值运算符。它将右侧的值分配给左侧的值。

对左侧的内容有限制。

引自this MSDN reference

  

赋值的左操作数必须是分类为变量,属性访问,索引器访问或事件访问的表达式。

ElementAt()是方法调用,因此它不能位于赋值运算符的左侧。

答案 4 :(得分:0)

因为 ElementAt 只是为了获取指定索引的元素,所以不能指定它(https://msdn.microsoft.com/en-us/library/bb299233(v=vs.110).aspx

您可以尝试删除索引处的项目并插入新项目,如下所示:

a.RemoveAt(2);
a.Insert(2, "word3");

答案 5 :(得分:0)

除了其他答案之外,除了它是方法而不是变量之外,请注意该方法在IEnumerable<T>上运行。在这种特殊情况下,您尝试为列表分配值,但ElementAt不限于列表,但可以对任何序列进行操作。

List<T>有一个索引器,它有一个setter,因此可以分配它。但是其他也实现IEnumerable<T>的类可能没有,即使它们可以与ElementAt一起使用,所以在这些情况下尝试分配甚至没有意义。