C#:在结构的数组中查找和更改元素

本文关键字:查找 元素 数组 结构 | 更新日期: 2023-09-27 18:24:00

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

table = new TableRow[10];

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

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

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

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

C#:在结构的数组中查找和更改元素

您不能更改Find()对值类型的工作方式。您可以将struct转换为class——通常,我们只将struct用于表示"单个"值的非常小(<=16字节)的值类型。MSDN在structclass方面有很好的指导:在类和结构之间进行选择

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

var pos = Array.FindIndex(table, tRow => tRow.color == 'red');
if (pos >= 0)
{
    table[pos].count++
}

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

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

然而,建议结构应该(几乎总是)是不可变的。根据James提供的MSDN链接(添加了重点):

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

  • 它在逻辑上表示单个值,类似于基元类型(integer、double等)
  • 它的实例大小小于16字节
  • 它是不可变的
  • 它不必经常装箱

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

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