#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 outerforeach
, иid
больше не находится в области видимости.2. Отличные ребята, большое вам спасибо за вашу помощь, благодаря вам я смог решить свою проблему