Страницы

Поиск по вопросам

пятница, 29 ноября 2019 г.

Как сравнить два List?

#c_sharp #list


Есть класс 

public class DB
{
    public string vopros { get; set; }
    public string otvet { get; set; }
    public string url { get; set; }
}


Есть два list

List list1 = 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 } Для небольших списков работает быстро, а для больших не тестил.

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

Отправить комментарий