C#:查找和更改struct数组中的元素

时间:2012-02-10 21:21:02

标签: c# arrays struct pass-by-reference

我有一个struct TableRow 和一个这样结构的数组 table

table = new TableRow[10];

现在我想查找并操作数组中某个结构的内容。
我使用Array.Find来搜索正确的数组元素:

var tr = Array.Find( table, tRow => tRow.color == 'red' );
tr.count++;

问题是结构是值类型,因此Find方法返回我想要操作的结构的副本。更改此副本不会更改数组中的结构。

我似乎找不到任何方法来指示Find方法通过引用返回结构。

3 个答案:

答案 0 :(得分:4)

您无法更改Find()对值类型的工作方式。您可以将struct转换为class - 通常我们只使用struct表示非常小(<= 16字节)的值,无论如何都代表“单个”值。 MSDN对此structclass有良好的指导:Chossing Between Classes and Structs

或者您可以使用FindIndex()获取数组中的位置,然后使用它来修改字段。

var pos = Array.FindIndex(table, tRow => tRow.color == 'red');

if (pos >= 0)
{
    table[pos].count++
}

答案 1 :(得分:3)

您可以使用FindIndex来获取匹配元素的从零开始的索引,然后改变它。

int i = Array.FindIndex(table, tRow => tRow.color == 'red');
table[i].count++;

但是,建议结构应该(几乎总是)是不可变的。根据@James提供的MSDN链接(强调添加):

  
    

除非类型具有以下所有特征,否则不要定义结构:

         
        
  • 它逻辑上表示单个值,类似于基本类型(整数,双精度等)。
  •     
  • 实例大小小于16个字节。
  •     
  • 这是不可改变的。
  •     
  • 不必频繁装箱。
  •     
  

由于您打算更新count实例的TableRow,因此您不应该首先使用结构。在我看来,你最好把它转换成一个类。

答案 2 :(得分:2)

因为结构是值类型,所以您必须创建TableRow的新实例并用它替换所需的元素。 您可以使用Array.FindIndex查找元素的索引。