Создание списка объектов, которые либо существуют, либо не существуют в другом другом списке объектов — С#
Итак, я пытаюсь сравнить два разных списка, которые содержат объекты с разной структурой. Один легко доступен, а другой очень вложен в массивы, но, к сожалению, это ответы от вызовов 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);