如何解决从对象数组中获取值更改的索引数组或第一个不同的值
我有一个已排序的对象数组,其中包含 3 个双精度值,我们称它们为 x、y 和 z。我需要为每个过渡点创建一个索引数组,例如:
index x y z
------------------
0 | 3 | 2 | 1
1 | 4 | 3 | 1
2 | 3 | 1 | 1
3 | 1 | 3 | 2
4 | 3 | 1 | 2
5 | 1 | 3 | 3
6 | 1 | 3 | 3
应该给我数组 {3,5} 因为那是 z 改变的点,我试过了
var ans = myObjectArr.Select(a => a.z).Distinct().ToList();
但这只是给了我一个值本身的列表,而不是它们在对象数组中的索引。该数组非常大,我想避免谨慎地遍历它。我觉得我只是错过了一些愚蠢的东西,任何帮助将不胜感激。生成列表或数组都是可以接受的。
编辑:我的印象是使用 Linq 比迭代更快,在阅读评论后,我发现情况并非如此,因此 Charlieface 的答案是最适合我的问题的答案。
解决方法
var lastZ = myObjectArr[0].z;
var zIndexes = new List<int>();
for(var i = 1; i < myObjectArr.Length; i++)
{
if(myObjectArr[i] != lastZ)
{
lastZ = myObjectArr[i];
zIndexes.Add(i);
}
}
// or you can use obscure Linq code if it makes you feel better
var zIndexes = myObjectArr
.Select((o,i) => (o,i))
.Skip(1)
.Aggregate(
new List<int>(),(list,tuple) => {
if(tuple.o.z != lastZ)
{
lastZ = tuple.o.z;
list.Add(tuple.i);
}
return list;
} );
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。