Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Duplicate values in generic list c#

Tags:

c#

I'm adding values to a c# generic list while trying to prevent duplicates, but without success. Anyone know of a reason why this code below wouldn't work?

I have a simple class here:

public class DrivePairs
{
    public int Start { get; set; }
    public int End { get; set; }
}

And here is my method which tries to return a generic list of the above class:

ArrayList found = DriveRepository.GetDriveArray(9, 138);
List<DrivePairs> drivePairs = new List<DrivePairs>();
foreach (List<int> item in found)
{
    int count = item.Count;
    if (count > 1)
    {
        for (int i = 0; i < (count - 1); i++)
        {
            DrivePairs drivePair = new DrivePairs();
            drivePair.Start = item[i];
            drivePair.End = item[i + 1];

            if (!drivePairs.Contains(drivePair))
                drivePairs.Add(drivePair);
        }
    }
}
drivePairs = drivePairs.Distinct().ToList();

As you can maybe see, I have an ArrayList, and each row contains a List<int>. What I'm doing is going through each and adding to a list which contains only pairs. E.g. if my List<int> contains [1,3,6,9] I want to add three entries to my pairs list:

[1,3]
[3,6]
[6,9]

It all works fine apart from not recognising duplicates. I thought this line would be enough:

if (!drivePairs.Contains(drivePair))
    drivePairs.Add(drivePair);

but it continues to add them all. Even when I add a Distinct() at the end, it still doesn't remove them. I've also tried adding them to a HashSet, but it still includes all the duplicates.

Anyone know of a reason why the duplicates might not be getting picked up?

like image 594
e-on Avatar asked Jul 23 '26 14:07

e-on


2 Answers

Your DrivePairs class does not specify equality, as a result, the Contains method will be using reference equality. Add an Equals method that uses both Start and End to determine equality and you will probably find your code works.

See: Equality Comparisons (C# Programming Guide)

like image 181
ColinE Avatar answered Jul 25 '26 04:07

ColinE


List.Contains Method

This method determines equality by using the default equality comparer, as defined by the object's implementation of the IEquatable.Equals method for T (the type of values in the list).

Change your DrivePairs class

    public class DrivePairs: IEquatable<DrivePairs>
    {
        public int Start { get; set; }
        public int End { get; set; }

        public bool Equals(DrivePairs other)
        {
            return (this.Start == other.Start && this.End == other.End)
        }
    } 

See: http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx

Hope this helps

like image 34
Jonas Anseeuw Avatar answered Jul 25 '26 04:07

Jonas Anseeuw



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!