[英]Replace value in an array of struct c#
我在 C# 中有以下公共结构:
public struct Route
{
public float Start;
public float End;
public float Range;
public bool InConstruction;
};
我想替换在另一个类 (Route[]) 中用作结构数组的每个属性 Range of Route。 我做了以下工作正常:
//dest.Route = new Route[];
for (var i = 0; i < dest.Route.Count; i++)
{
dest.Route[i].Range = dest.Route[i].End - dest.Route[i].Start;
}
有没有办法优化这个循环或只是其他方法来实现这个解决方案?
也许使用 desc.Route.Select(i => i.Range = i.End - i.Start); ?
如果你不能改变结构,那么不,你已经做了最优化的事情。 即使您确实使用 Linq 找到了一些解决方案,它最终也会像您一样归结为一个循环。
如果你死心塌地使用 Linq,你需要做这样的事情:
desc.Route = desc.Route.Select(d => {
d.Range = d.End - d.Start;
return d;
})
.ToArray();
我会让你来评判这对你的项目是否“更好”。 这确实违反了 Linq 的一些原则,主要是“不引起副作用”。
这个:
.Select(i => i.Range = i.End - i.Start)
不起作用(尽管它是合法的语法),因为赋值运算符返回已分配的值,因此您将仅选择分配给 Range 属性的浮点数,而不是完整的 Route 对象。 https://dotnetfiddle.net/jSKZlj
如果您可以更改结构:
如果Range
始终是End
字段减去Start
字段,那么您可以在需要读取 value 时计算它,而不是先发制人。 无耻地接受Etienne de Martel 的想法:
public struct Route
{
public float Start;
public float End;
public float Range => End - Start;
public bool InConstruction;
};
现在根本不需要进行循环计算。 读取Range
属性后,将立即计算每个对象的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.