使用Linq查找连续数字序列中的变化点索引

时间:2017-11-09 05:04:04

标签: c# linq

我有一个带有指定值的List。它可以包含任何值。假设哪个具有以下测试值。

1,1,1,5,5,4,4,1,1,1,3,3,3,3,3

我只需要找到连续的数字更改位置作为输出。例如,在上述情况下,更改为1->5 then 5->4, 4->1 and 1->3.,因此输出列表应返回更改的位置4,6,8,11.

我可以遍历列表并通过比较连续数字轻松找到位置,但我很好奇如何在linq 中实现这一点。

4 个答案:

答案 0 :(得分:2)

这是实现此目的的一种方法,使用Index overload of Select对项目进行编号,然后使用method 2拉出相邻项目,然后进行比较:

function removeDuplicates(myArr, prop) {
  return myArr.filter((obj, pos, arr) => {
    return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos;
  });
}

+1是因为你似乎想要一个基于1的索引。

(我已经使用了ValueTuples - 如果您使用的是旧版本的C#,则替换为Skip(1)

当然,这不太可能像命令式循环一样高效!

答案 1 :(得分:0)

如果您想使用linq,首先需要创建另一个项目和索引列表,然后使用上一项检查当前项目。如果不相等则选择它。

var arr = new int[] { 1, 1, 1, 5, 5, 4, 4, 1, 1, 1, 3, 3, 3, 3, 3 };

       var output = arr.Select((num, i) => new { Num = num, Index = i })
                    .Where((item, index) => index != 0 && item.Num != arr[index-1])
                    .Select(z => z.Index+1);

.NET Fiddle

答案 2 :(得分:0)

另一种可能的解决方案:

int[] nums = { 1, 1, 1, 5, 5, 4, 4, 1, 1, 1, 3, 3, 3, 3, 3 };
int[] changes = Enumerable.Range(1, nums.Length - 1).Where(i => nums[i - 1] != nums[i]).Select(i => i + 1).ToArray();

答案 3 :(得分:0)

试试这个soluion

var list = new List<int> { 1, 1, 1, 5, 5, 4, 4, 1, 1, 1, 3, 3, 3, 3, 3 };
var result = list.Select((v, i) => new { v, i }).Skip(1)
                 .Where(x => list[x.i - 1] != x.v).Select(x => x.i + 1).ToList();