Создание списка объектов, которые либо существуют, либо не существуют в другом другом списке объектов — С#

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

      var foundList = new List<Structure1>();
var notFoundList = new List<Structure1>(); 

Объекты структурированы следующим образом:

      public class ObjectsA
{
    public Structure1[] Structure1 {get; set;}
}

public class Structure1
{
    public int id {get; set;} //1
}

И другой объект выглядит так:

      public class ObjectsB
{
    public Array1[] array1{get; set}
}

public class Array1
{
    public Array2[] array2{get; set;}
}

public class Array2
{
    public string id {get; set;} //"0001"
}

В список я добавил все объекты, которые вернулись из вызова API, поэтому ObjectAList технически содержит только 1 ответ десериализованного объекта, который содержит массив объектов, а ObjectBList содержит список объектов, добавленных к нему через AddRange.

Сначала я попытался поместить Array.Exists() внутри двух операторов foreach().

      foreach (var arr1 in ObjectsBList){ 
  foreach (var arr2 in a.Array2){ 
    if (Array.Exists(ObjectAList.Structure1, item => item.id == Convert.ToInt32(arr2.id)) == true){
      foundList.AddRange(ObjectAList.Structure1);
    }
    else{
      notFoundList.AddRange(ObjectAList.Structure1)
    }}};

Этот код, казалось, продолжал зацикливаться на части «item => item.id == Convert.ToInt32(arr2.id)», поэтому, следовательно, он продолжал работать, пока не нашел совпадение, и поэтому ответ всегда был «истинным». , поэтому просто поместите все в foundList. Я знаю, что, вероятно, поступаю неправильно. Я только начинаю программировать на С#, и мне трудно понять некоторые из этих вещей и узнать, какие все функции существуют, чтобы помочь с тем, что мне нужно, и т. д. Любая помощь была бы здорово!

2 ответа

Вы можете использоватьlinqдля запроса объектов в памяти.

псевдокод

      public class Test {
    public void T()
    {
        var ObjectsBList = new ObjectsB();
        var ObjectAList = new ObjectsA();
        var foundList = new List<Structure1>();
        var notFoundList = new List<Structure1>();

        var bList = ObjectsBList
            .array1
            .SelectMany(x => x.array2)
            .Select(x => Convert.ToInt32(x.id))
            .Distinct()
            .ToList();

        if (ObjectAList.Structure1.Any(x => bList.Contains(x.id)))
        {
            foundList.AddRange(ObjectAList.Structure1);
        }
        else
        {
            notFoundList.AddRange(ObjectAList.Structure1);
        }
    }
}

Более упрощенная версия:
введитеID listсвойство

      using System;
using System.Text;
using System.Collections.Generic;
using System.Collections;



public class ObjectsA
{
    public Structure1[] Structure1 { get; set; }

    public List<int> IDs
    {
        get
        {
            return Structure1.Select(x => x.id).Distinct().ToList();
        }
    }
}

public class Structure1
{
    public int id { get; set; } //1
}

public class ObjectsB
{
    public Array1[] array1 { get; set; }

    public List<int> IDs
    {
        get
        {
            return array1
                .SelectMany(x => x.array2)
                .Select(x => Convert.ToInt32(x.id))
                .Distinct()
                .ToList();
        }
    }
}

public class Array1
{
    public Array2[] array2 { get; set; }
}

public class Array2
{
    public string id { get; set; } //"0001"
}

public class Test
{
    public void T()
    {
        var ObjectsBList = new ObjectsB();
        var ObjectAList = new ObjectsA();
        var foundList = new List<Structure1>();
        var notFoundList = new List<Structure1>();

        if (ObjectAList.IDs.Any(x => ObjectsBList.IDs.Contains(x)))
        {
            foundList.AddRange(ObjectAList.Structure1);
        }
        else
        {
            notFoundList.AddRange(ObjectAList.Structure1);
        }
    }
}
          var objA = new ObjectsA();
    var objB = new ObjectsB();

    var objAIds = objA.Structure1.Select(x => x.Id).Distinct();
    var objBIds = objB.Array1.SelectMany(x => x.Array2).Select(x => int.Parse(x.Id)).Distinct();

    var foundInBothList = objAIds.Intersect(objBIds);
    var notFoundinBList = objAIds.Except(objBIds);

    var inBoth = objA.Structure1.Where(x => foundInBothList.Contains(x.Id));
    var notInB = objA.Structure1.Where(x => notFoundinBList.Contains(x.Id));

Начиная с .NET 6

          var objBIds = objB.Array1.SelectMany(x => x.Array2).Select(x => int.Parse(x.Id)).Distinct();
    var foundList = objA.Structure1.IntersectBy(objBIds, x => x.Id);
    var notFoundList = objA.Structure1.ExceptBy(objBIds, x => x.Id);
Другие вопросы по тегам