Given a class with the following definition:
public class MyTestClass
{
public int ValueA { get; set; }
public int ValueB { get; set; }
}
How can duplicate values be found in a MyTestClass[] array?
For example,
MyTestClass[] items = new MyTestClass[3];
items[0] = new MyTestClass { ValueA = 1, ValueB = 1 };
items[1] = new MyTestClass { ValueA = 0, ValueB = 1 };
items[2] = new MyTestClass { ValueA = 1, ValueB = 1 };
Contains a duplicate as there are two MyTestClass objects where ValueA and ValueB both = 1
To find the duplicate values only:var duplicates = list. GroupBy(x => x. Key). Where(g => g.
Linq, acts upon 2 collections. It returns a new collection that contains the elements that are found. Union removes duplicates. So this method can be thought of as two actions: it combines the two collections and then uses Distinct() on them, removing duplicate elements.
Using Enumerable. We can use the Enumerable. GroupBy() method to group the elements based on their value, then filters out the groups that appear only once, leaving them out with duplicates keys.
How to remove the duplicates in the list using linq? You can also do var set = new HashSet<int>(); var uniques = items. Where(x => set. Add(x.Id)); .
You can find your duplicates by grouping your elements by ValueA and ValueB. Do a count on them afterwards and you will find which ones are duplicates.
This is how you would isolate the dupes :
var duplicates = items.GroupBy(i => new {i.ValueA, i.ValueB})
.Where(g => g.Count() > 1)
.Select(g => g.Key);
You could just use Jon Skeet's DistinctBy
and Except
together to find duplicates. See this Response for his explanation of DistinctBy
.
MyTestClass[] items = new MyTestClass[3];
items[0] = new MyTestClass { ValueA = 1, ValueB = 1 };
items[1] = new MyTestClass { ValueA = 0, ValueB = 1 };
items[2] = new MyTestClass { ValueA = 1, ValueB = 1 };
MyTestClass [] distinctItems = items.DistinctBy(p => new {p.ValueA, p.ValueB}).ToArray();
MyTestClass [] duplicates = items.Except(distinctItems).ToArray();
It will only return one item and not both duplicates however.
MyTestClass should implement the Equals method.
public bool Equals(MyTestClass x, MyTestClass y)
{
if (Object.ReferenceEquals(x, y)) return true;
if (Object.ReferenceEquals(x, null) ||
Object.ReferenceEquals(y, null))
return false;
return x.ValueA == y.ValueA && y.ValueB == y.ValueB;
}
Here you have a good article about it.
After that you can get a "clean" list of MyTestClass with "Distinct" method.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With