C#:在结构数组中查找和更改元素
我有一个struct TableRow和这样的结构的数组表:C#:在结构数组中查找和更改元素,c#,arrays,struct,pass-by-reference,C#,Arrays,Struct,Pass By Reference,我有一个struct TableRow和这样的结构的数组表: table = new TableRow[10]; 现在我想查找并操作数组中一个结构的内容 我使用Array.Find搜索正确的数组元素: var tr = Array.Find( table, tRow => tRow.color == 'red' ); tr.count++; 问题是结构是值类型,所以Find方法返回我想要操作的结构的副本。更改此副本不会更改数组中的结构 我似乎找不到任何方法来指示find方法通过引用返回
table = new TableRow[10];
现在我想查找并操作数组中一个结构的内容我使用Array.Find搜索正确的数组元素:
var tr = Array.Find( table, tRow => tRow.color == 'red' );
tr.count++;
问题是结构是值类型,所以Find方法返回我想要操作的结构的副本。更改此副本不会更改数组中的结构
我似乎找不到任何方法来指示find方法通过引用返回结构。您无法更改
find()
对值类型的工作方式。您可以将结构
转换为类
——通常我们只对非常小的()使用结构
,因为结构是值类型,您必须创建TableRow的新实例并用它替换所需的元素。
您可以使用Array.FindIndex查找元素的索引。您可以使用
FindIndex
获取匹配元素的从零开始的索引,并对其进行更改
int i = Array.FindIndex(table, tRow => tRow.color == 'red');
table[i].count++;
但是,建议结构应该(几乎总是)是不可变的。根据提供的MSDN链接@James(重点添加):
除非类型具有以下所有特征,否则不要定义结构:
- 它在逻辑上表示单个值,类似于基本类型(整数、双精度等)
- 它的实例大小小于16字节
- 它是不可变的。
- 它不必经常装箱
既然你打算更新你的
TableRow
实例的count
,那么你首先就不应该使用结构。在我看来,你最好把它转换成类。你能展示一下TableRow结构体吗?当你需要自定义结构类型时,这是非常罕见的情况,考虑一下将它转换成类一个类,如果它的总字段大小超过16字节…或者在初始化后需要更改任何字段。感谢Douglas。结构应该始终是不可变的这一明确提示使我很快找到了有关该主题的更多信息。我肯定会转换为类。谢谢,James。三个答案中最完整、最快的一个,所以你得到了复选标记。谢谢!当我第一次进入C时,我对结构和类有很多先入为主的概念,它们是非常不同的鸟,各有其优缺点。正如道格拉斯所说,由于它们的传递值语义,它们往往最适合于不可变的值(DateTime
,TimeSpan
,等等都是最好的例子)因为只有这样,他们才会更有效率
int i = Array.FindIndex(table, tRow => tRow.color == 'red');
table[i].count++;