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

问题描述

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