从对象数组中获取值更改的索引数组或第一个不同的值
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;
} );
我有一个排序的对象数组,其中包含 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;
} );