У меня есть список

var resource = new List<Resource>();

Ресурс выглядит так

public class Resource
{
    public int RepatedId { get; set; }
    public string Name { get; set; }
    public List<string> Data { get; set; }
}

Различные объекты ресурсов могут иметь одинаковый RepeatedId

И моя основная цель - найти пары объектов ресурсов, в которых элемент из списка данных существует в другом объекте ресурса под тем же RepeatedId.

Я сгруппировал ресурсы по RepatedId

var grouped = resource.GroupBy(x => x.RepatedId , x => x.Data);

Но я понятия не имею, как я могу взять первый элемент из Data в первом ресурсе и перебрать другие, чтобы найти тот же элемент в разных объектах.

Пример данных:

var resource = new List<Resource>
{
    new Resource
    {
        RepatedId = 1,
        Name = "whatever",
        Data = new List<string>
        {
            "example1",
            "example11",
            "example111"
        }
    },
    new Resource
    {
        RepatedId = 2,
        Name = "whatever",
        Data = new List<string>
        {
            "example2",
            "example11",
            "example222"
        }
    },
    new Resource
    {
        RepatedId = 1,
        Name = "whatever",
        Data = new List<string>
        {
            "example2",
            "example11",
            "example222"
        }
    },
    new Resource
    {
        RepatedId = 1,
        Name = "whatever",
        Data = new List<string>
        {
            "example3",
            "example22",
            "example11"
        }
    },
};

Мне нужны пары всех комбинаций. Итак, в первом элементе у меня есть "example11", который также находится в третьем и четвертом (также во втором, но у него нет того же RepeatedId), должно быть так

  • первый объект ресурса и третий
  • первый и четвертый
  • третий и четвертый

Вопрос в том:

Как я могу выполнить итерацию по коллекции, чтобы найти пары комбинаций и вернуть их (возвращая пару объектов ресурсов)?

-1
Krystian 16 Мар 2021 в 02:03

1 ответ

Лучший ответ

Если вы объедините группу, отбрасывающую последнего члена, с той же группой, пропускающей первого члена, и исключите пары, в которых члены совпадают, то вы можете отфильтровать пары, в которых есть элемент в Data первого члена. который находится в Data второго члена:

var ans = resource
            .GroupBy(r => r.RepatedId)
            .SelectMany(rg => rg.Take(rg.Count()-1)
                                .SelectMany((r1,n) => rg.Skip(n+1).Select(r2 => new { r1, r2 })))
            .Where(rp => rp.r1.Data.Any(d1 => rp.r2.Data.Contains(d1)))
            .ToList();
0
NetMage 16 Мар 2021 в 17:54