Нужен совет по выражению агрегации C # LINQ List - PullRequest
2 голосов
/ 24 июня 2019

Допустим, у меня есть этот список типа Цены:

[
    {
        "Id": 57571,
        "Price": 1745.0,
        "DateAdded": "2018-12-01T00:00:00"
    },
    {
        "Id": 67537,
        "Price": 1695.0,
        "DateAdded": "2018-09-24T00:00:00"
    },
    {
        "Id": 80042,
        "Price": 1645.0,
        "DateAdded": "2019-03-24T00:00:00"
    },
    {
        "Id": 155866,
        "Price": 1545.0,
        "DateAdded": "2019-04-24T00:00:00"
    },
    {
        "Id": 163643,
        "Price": 1545.0,
        "DateAdded": "2019-04-26T00:00:00"
    },
    {
        "Id": 171379,
        "Price": 1545.0,
        "DateAdded": "2019-04-27T00:00:00"
    },
    {
        "Id": 178990,
        "Price": 1545.0,
        "DateAdded": "2019-04-28T00:00:00"
    }
]

Мне нужно удалить все элементы с одинаковой ценой, но только если элемент является родственным элементом элемента списка.Можно ли добиться этого с помощью LINQ?

Мой ожидаемый результат будет

[
    {
        "Id": 57571,
        "Price": 1745.0,
        "DateAdded": "2018-12-01T00:00:00"
    },
    {
        "Id": 67537,
        "Price": 1695.0,
        "DateAdded": "2018-09-24T00:00:00"
    },
    {
        "Id": 80042,
        "Price": 1645.0,
        "DateAdded": "2019-03-24T00:00:00"
    },
    {
        "Id": 155866,
        "Price": 1545.0,
        "DateAdded": "2019-04-24T00:00:00"
    }
]

. Я понятия не имею, как мне этого добиться.Я ценю любой совет.

Ответы [ 3 ]

3 голосов
/ 24 июня 2019

Используя ChunkBy метод расширения , найденный в документации Microsoft C #, вы можете

myData.ChunkBy(x => x.Price).Select(g => g.First())

... или MoreLinq's GroupAdjacentВы можете

myData.GroupAdjacent(x => x.Price).Select(g => g.First())
2 голосов
/ 24 июня 2019

Вы можете просто сделать это, используя итератор:

using System;
using System.Collections.Generic;

public class Test
{
    public static void Main()
    {
        var input = new[] { 1, 2, 2, 3, 4, 4, 3, 2, 2, 1 };

        var output = GetUniqueAdjacent(input);

        foreach (var o in output)
        {
            Console.WriteLine(o);
        }
    }

    public static IEnumerable<int> GetUniqueAdjacent(IEnumerable<int> input)
    {
        bool first = true;
        int previous = -1;
        foreach (var i in input)
        {
            if (first)
            {
                previous = i;
                yield return i;
                first = false;
                continue;
            }

            if (i == previous)
            {
                previous = i;
                continue;
            }

            previous = i;
            yield return i;
        }
    }
}

Это выводит 1, 2, 3, 4, 3, 2, 1, удаляя дубликаты, только если они находятся рядом.

0 голосов
/ 24 июня 2019

Это можно сделать с помощью обычного Where вызова.

int? previousPrice = null;

var output = myData.Where(d => {
  var result = !previousPrice.HasValue || previousPrice.Value != d.Price;
  previousPrice = d.Price;
  return result;
}).ToList();
...