#c_sharp #list
Есть класс public class DB { public string vopros { get; set; } public string otvet { get; set; } public string url { get; set; } } Есть два list Listlist1 = new List (); List list2 = new List (); Как сравнить эти два list? чтобы например в list3 были те элементы которые есть в первом и нет во втором? Проходиться в цикле думаю не так хорошо. Может есть лучше решение?
Ответы
Ответ 1
Если вам надо именно сравнить, то есть, выяснить, одинаковы списки или нет, к вашим услугам метод SequenceEquals. list1.SequenceEquals(list2) Этот метод сравнивает ещё и порядок элементов. Если вам нужно выяснить, совпадают ли наборы элементов без учёта порядка, эффективнее всего сконструировать из первой последовательности множество, и проверять равенство так: new HashSet(list1).SetEquals(list2) Если вам необходимо сравнивать не экземпляры, а значения, то вы либо определяете универсальный метод сравнения (реализуете IEquatable ), либо передаёте вашу реализацию IEqualityComparer следующим образом: list1.SequenceEquals(list2, comparer) или соответственно new HashSet (list1, comparer).SetEquals(list2) Ответ 2
using System.Linq; //.... var list3 = list1.Except(list2).ToList(); Если элементы нужно сравнивать по значению полей - то придется сделать одно из следующего: поменять class на struct переопределить в DB методы Equals и GetHashCode создать класс-наследник от IEqualityComparerи передать экземпляр этого класса вторым параметром в Except Ответ 3
Вообще, на данный момент, как мне кажется, правильным решением будет использовать метод Enumerable.SequenceEqual< TSource > (с) MSDN И код будет выглядеть примерно так: bool isEqual = list1.SequenceEqual(list2);Ответ 4
foreach (var item in list1) { if (list2.Any(c => c.vopros == item.vopros)) { list3.Add(item); } }Ответ 5
Что бы корректно сравнить два списка объектов типа Т необходимо для этого типа реализовать IEqualityComparer. Код пишу "на коленке", так что прошу прощения за возможные синтаксически ошибки. public class DbComparer: IEqualityComparer { pablic static DbComparer Comparer {get;} = new DbComparer(); private DbComparer{} public bool Equels(DB one, DB two) { //описываем логику сравнения объектов заданного типа return string.Compare(one.vopros, two.vopros, StringComparison.CurrentCulture) == 0 && string.Compare(one.otvet, two.otvet, StringComparison.CurrentCulture) == 0 && string.Compare(one.url, two.url, StringComparison.CurrentCulture) == 0; } pablic int GetHashCode(DB obj) { //реализация для .NET Core. для .NET Framework на память не помню return System.HashCode.Combine(obj.vopros, obj.otvet, obj.url ) } } Пример использования: var hashOne = new HashSet (list1, DbComparer.Comparer); var hashTwo = new HashSet (list2, DbComparer.Comparer); hashOne.SymmetricExceptWith(hashTwo); //SymmetricExceptWith оставит в hashOne только уникальные элементы if (hashOne.Count > 0) { //Если списки отличаются do something } Для небольших списков работает быстро, а для больших не тестил.
Комментариев нет:
Отправить комментарий