Veena Hosur Ответов: 4

Как сравнить два списка в C#


Привет,
у меня есть два списка, которые содержат одно и то же свойство.Я хочу сравнить эти два списка и вернуть только разностное значение свойства в c#

Что я уже пробовал:

я прошел через google, но не нашел решения

Philippe Mori

Вы должны показать пример списков и ожидаемый ответ.

4 Ответов

Рейтинг:
2

Patrice T

Вы можете попробовать что-то подобное:

for (int i= 1; i < ListA.length; i++) {
	if (ListA[i] != ListB[i]) {
		// diferent, do what you want
		}
	}


Maciej Los

Что ж... Что делать, если размер списка отличается (например, ListB длиннее ListA)? Что делать, если объекты в обоих списках не являются простыми типами и не предоставляют способа их сравнения (нет никакого способа использовать операторы сравнения)?

Patrice T

Что ж... Сравнение 2 списков настолько тривиально/элементарно, что вопрос выглядит как домашнее задание, ОП не показывал никакого кода и не имел тени первого ключа к разгадке ситуации. Поэтому я позволил оператору разобраться с деталями.

Рейтинг:
19

Maciej Los

Начать здесь: Как найти заданную разницу между двумя списками (LINQ)[^]

Например:

Определение класса

public class Point
{
   private int x = 0;
   private int y = 0;
   
   public Point()
   {
   	//default constructor
   }
   
   public Point(int _x, int _y)
   {
        x = _x;
        y = _y;
   }
   
   public int X
   {
   	get { return x; }
	set { x = value; }
   }
   
   public int Y
   {
   	get { return y; }
	set { y = value; }
   }

   public override bool Equals(Object obj) 
   {
      // Check for null values and compare run-time types.
      if (obj == null || GetType() != obj.GetType()) 
         return false;

      Point p = (Point)obj;
      return (x == p.x) && (y == p.y);
   }

   public override int GetHashCode() 
   {
      return x ^ y;
   }
}


Использование:
void Main()
{
	List<Point> pointsA = new List<Point>();
	pointsA.Add(new Point(5,5));
	pointsA.Add(new Point(10,8));
	
	List<Point> pointsB = new List<Point>();
	pointsB.Add(new Point(5,5));
	pointsB.Add(new Point(9,8));
	
	var result = pointsA.Union(pointsB) //union 
			.Except( //except
				pointsA.Intersect(pointsB) //common
				);

	
}


Результат:
X  Y
10 8 
9  8 


Как видите, список результатов содержит уникальные точки.


Philippe Mori

Я думаю, что ОП нужны только точки, которые отличаются друг от друга...

Maciej Los

Может быть, ты и прав, Филипп. Наверное ОП хочет получить только 2 очка: {(10,8), (9,8)}. Скоро я улучшу свой ответ.
[РЕДАКТИРОВАТЬ]
- Готово!

Рейтинг:
1

Halit Yurttaş

измените код, как показано ниже этой строки

var result = pointsA.Union(pointsB).Where(w => !(pointsA.Contains(w) && pointsB.Contains(w)));


Результат
10 8
9 8


Philippe Mori

Я думаю, что этот код не очень эффективен.

Halit Yurttaş

Я думаю, что это не короткий путь, или я так знаю. Извиняюсь

Maciej Los

Воспользуйся Ответить виджет для отправки ответа.
Есть более простой способ. Проверьте мое решение после обновления.

Рейтинг:
0

SreeniChamp

Самый простой и быстрый способ

The Except method returns IEnumerable, you need to convert the result to list:

var firstNotSecond = list1.Except(list2).ToList();

var secondNotFirst = list2.Except(list1).ToList();

Надеюсь, это решит вашу проблему


Maciej Los

Он должен работать для списка простых объектов, таких как целое число, строка и т. д. Для более сложных объектов, таких как пользовательский класс с набором свойств, он не будет работать, потому что объекты должны быть выставлены Equals() метод.