从对象数组中获取值更改的索引数组或第一个不同的值

Get index array of value changes or first distinct values from array of Objects

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