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方法通过引用返回结构。
您不能更改Find()
对值类型的工作方式。您可以将struct
转换为class
——通常,我们只将struct
用于表示"单个"值的非常小(<=16字节)的值类型。MSDN在struct
和class
方面有很好的指导:在类和结构之间进行选择
或者,您可以使用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查找元素的索引。