Рассчитать разницу элементов в массиве - PullRequest
3 голосов
/ 20 февраля 2011

Есть ли способ рассчитать разницу между элементами в массиве и проверить, составляет ли разница> 1, используя LINQ?

Итак, если у вас есть массив {1,2,3,5,8,9}, вы хотите узнать разницу между каждым из элементов и получить только те элементы, которые следуют непосредственно за каждым, так что разница == 1.

Возможно ли это с помощью LINQ?

Ответы [ 3 ]

4 голосов
/ 20 февраля 2011

Вы можете использовать перегрузку .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();

Отредактировано для захвата всех чисел, которые являются частью «острова» последовательных чисел, с размером острова> 1 - это означает, что вам нужно смотреть вперед и назад от каждого числа, чтобы определить, является ли предшественник или преемник последовательным .

В данном примере вывод {1,2,3,8,9}.

3 голосов
/ 20 февраля 2011

Вы можете использовать некоторые трюки с 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 голосов
/ 20 февраля 2011
    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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...