问题描述
我有一个已排序的对象数组,其中包含 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;
} );