计算数组中元素的差异

时间:2011-02-20 18:25:55

标签: c# arrays linq c#-4.0

有没有办法计算数组中元素之间的差异,并检查差异是否> 1使用LINQ?

所以如果你有一个数组{1,2,3,5,8,9},想要知道每个元素之间的差异,并且只获得每个元素后面的元素,所以差异== 1。

这可以使用LINQ吗?

3 个答案:

答案 0 :(得分:4)

您可以使用使用索引的.Where重载 - 当然这也使用了数字是带索引运算符的数组的事实:

int[] numbers = new[] { 1, 2, 3, 5, 8, 9 };
int[] followNumbers = numbers.Where((x, idx) => 
                                (idx >=1 && numbers[idx-1] == x-1 
                                 || (idx < numbers.Length-1 
                                     && numbers[idx+1] == x+1) ))
                              .ToArray();

编辑以捕获属于连续数字“孤岛”的所有数字,其岛大小为&gt; 1 - 这意味着您必须从每个数字向前和向后查找,以查找前任或后继是否连续。

示例中的输出为{1,2,3,8,9}

答案 1 :(得分:3)

您可以使用Enumerable.Zip

的一些技巧
var testArray = new int[] { 1, 2, 3, 5, 8, 9 };
var withNextElement = testArray.Zip(testArray.Skip(1), Tuple.Create);
var onlyOffByOne = withNextElement.Where(x => x.Item1 + 1 == x.Item2);
var withMatchingNext = onlyOffByOne.Select(x => x.Item1);
foreach(var item in withMatchingNext)
    Console.WriteLine(item);

给出

1
2
8

您想如何处理最后一个元素?

应该包括9个?是否应该包含{1,2,3,5,8}中的最后一个元素?

答案 2 :(得分:2)

    int[] a = { 1, 2, 3, 5, 8, 9 };
    var b = a.Where((item, index) =>
    {
        if(index + 1 == a.Length)
            return false;

        return item - a[index + 1] == -1;
    }).ToArray();