0

Sorry but there is no code for this question... I hope thats ok.

So, I have a list of objects with two properties, DateTime and String.

As a matter of fact, DateTime is just date (insertDate), for example 2022-02-04T00:00:00+01:00. String is of course some text, a lot of text :)

I have to compare the list with these two properties with another list of identical structure.

To be more clear, those are the data returned by the API, so I have to compare is there any differences between these two lists.

sosNiLa
  • 289
  • 6
  • 18
  • https://stackoverflow.com/questions/22173762/check-if-two-lists-are-equal Maybe this will answer your question? – JamesS Feb 08 '22 at 10:43
  • its not enough what do you want to compare?? you have a list1 and you have a list2, what do you want to compare for list2 new item? same hour, same string... – Frenchy Feb 08 '22 at 10:43

2 Answers2

0

Do it like this (it will compare two lists based on element index , so if your lists are unsorted you must sort them and then use these codes) :

public class YourClass
{
    public DateTime DateTime { get; set; }
    public string String { get; set; }
}

public class Program
{
    static List<YourClass> list1 = new List<YourClass>
    {
        new YourClass { DateTime = DateTime.MinValue, String = "str1"},
        new YourClass { DateTime = DateTime.Now.AddDays(1), String = "str2"},
        new YourClass { DateTime = DateTime.Now.AddDays(2), String = "str3"}
    };

    static List<YourClass> list2 = new List<YourClass>
    {
        new YourClass { DateTime = DateTime.MinValue, String = "str1"},
        new YourClass { DateTime = DateTime.Now.AddDays(-1), String = "2str"},
        new YourClass { DateTime = DateTime.Now.AddDays(-2), String = "3str"}
    };

    static void Main(string[] args)
    {
        //a list of integer for storing different elements indexes
        var differentElementsIndexes = new List<int>();

        //check difference of these two list using for loop
        for (int i = 0; i < list1.Count; i++)
        {
            if (list1.ElementAt(i).DateTime != list2.ElementAt(i).DateTime || list1.ElementAt(i).String != list2.ElementAt(i).String)
                differentElementsIndexes.Add(i);
        }
    }
  • if List2 have more elements than list1 (and comes after the last ordered element of list1) you miss those differences – J.Salas Feb 08 '22 at 11:40
0

You can use a CustomComparator:

Given your base class for both lists:

public class BaseClass 
{ 
    public DateTime date { get; set; }
    public string anyString { get; set; }
}

Define the custom comparer for it

public class BaseClassComparer : IEqualityComparer<BaseClass>
{
    public bool Equals(BaseClass item1, BaseClass item2)
    {
        //Check whether the compared objects reference the same data.
        if (Object.ReferenceEquals(item1, item2)) return true;

        //Check whether any of the compared objects is null.
        if (Object.ReferenceEquals(item1, null) || Object.ReferenceEquals(item2, null))
        return false;

        //Check whether the required fields' properties are equal.
        return (item1.date == item2.date) && (item1.anyString == item2.anyString);
    }

    public int GetHashCode(BaseClass item)
    {
        //Check whether the object is null
        if (Object.ReferenceEquals(item, null)) return 0;

        //Get hash code for the Date field if it is not null.
        int hashItemDate = item.date == null ? 0 : item.date.GetHashCode();

        //Get hash code for the string field.
        int hashItemString = item.anyString.GetHashCode();

        //Calculate the hash code for the item.
        return hashItemDate ^ hashItemString;
    }
}

Then you can use it as follows:

        List<BaseClass> class1 = new List<BaseClass>();
        List<BaseClass> class2 = new List<BaseClass>();
        BaseClass item1 = new BaseClass() {date = DateTime.Now, anyString = "Hello"};
        class1.Add(item1);
        class2.Add(item1); //<-Equal till here
        //class1.Add(item1); //<-uncomment for false
        bool result = class1.SequenceEqual(class2, new BaseClassComparer());
J.Salas
  • 1,268
  • 1
  • 8
  • 15