我有一个struct TableRow 和一个这样结构的数组 table :
table = new TableRow[10];
现在我想查找并操作数组中某个结构的内容。
我使用Array.Find来搜索正确的数组元素:
var tr = Array.Find( table, tRow => tRow.color == 'red' );
tr.count++;
问题是结构是值类型,因此Find方法返回我想要操作的结构的副本。更改此副本不会更改数组中的结构。
我似乎找不到任何方法来指示Find方法通过引用返回结构。
答案 0 :(得分:4)
您无法更改Find()
对值类型的工作方式。您可以将struct
转换为class
- 通常我们只使用struct
表示非常小(<= 16字节)的值,无论如何都代表“单个”值。 MSDN对此struct
与class
有良好的指导: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查找元素的索引。