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



我有一个包含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;
} );

最新更新