c # сравнение массивов

#c# #linq #list

#c# #linq #Список

Вопрос:

всем добрый день

вопрос довольно простой, но у меня были проблемы весь день

у меня есть 2 списка:

  • список целых чисел (идентификаторов)
  • список объектов (который содержит идентификаторы)

и я хочу сравнить их, но я хочу получить идентификатор, у которого нет пары (если он существует)

мне было интересно, существует ли метод c # или linq для определения значений, которые отличаются в двух массивах

пример

если у меня есть

 List<int> ids = {1,2,3,4,5}
  

и

 List<objectX> x = (contains id,code, and description)
  

и я пытался что-то вроде

 foreach (int id in ids)
        {
            foreach (objectX item in x)
            {
                if (item.id == id)
                {
                    break;
                }
                else
                    idDiferentes.Add(id);
            }
        }
  

но, как вы можете себе представить, это не работает

например

 ids= {1,2,3,4}
objectx[id] ={1,3,2}
  

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

я также пробовал использовать linq outer join, но я не понимаю, как это работает довольно хорошо

Комментарии:

1. if (item.id != id) idDiferentes.Add(id) и, пожалуйста, не используйте «u» вместо «you» и «i» вместо «я».

Ответ №1:

 var idsWithoutObjects = ids.Except(x.Select(item => item.id));
  

Ответ №2:

То, что вам нужно, — это метод расширения Except. Это дает вам заданную разницу между двумя последовательностями.

Итак, вы можете сделать что-то вроде этого (псевдо c #-код):

 var idDifferences = x.Select(item => item.id).Except(ids);
  

Ответ №3:

Операции набора Linq:

 int[] A = { 1 , 2 , 3 , 4 , 5 ,     } ;
int[] B = {     2 , 3 , 4 , 5 , 6 , } ;

int[] A_NotIn_B = A.Except( B ).ToArray() ;
int[] B_NotIn_A = B.Except( A ).ToArray() ;
  

Ну вот и все.

Ответ №4:

В качестве альтернативы LINQ (хотя LINQ, вероятно, является правильным ответом здесь), если все ваши идентификаторы уникальны, вы можете использовать Contains() метод, например:

 foreach(objectX item in x)
{
    if(!ids.Contains(item.id))
    {
        idDiferentes.Add(item.id);
    }
}
  

Ответ №5:

Проще использовать флаг, например:

 bool b = False;

foreach (int id in ids)
        {
            foreach (objectX item in x)
            {
                if (item.id == id)
                {
                    b = True;
                    break;
                }
            }
        }

if (!b)
{
    idDiferentes.Add(id);
}
  

Комментарии:

1. это не привело бы к компиляции. Среди других проблем, у вас есть if (!b) outside of the outer foreach , и id больше не находится в области видимости.

2. Отличные ребята, большое вам спасибо за вашу помощь, благодаря вам я смог решить свою проблему