using System.Collections.Generic;
public static void Main()
var fields = new List<Field>{new Field(1), new Field(1), new Field(2), new Field(3), new Field(3)};
var artifacts = new List<Artifact>{new Artifact(1), new Artifact(2), new Artifact(2), new Artifact(3), new Artifact(3)};
var duplicateFields = GetDuplicates(fields, new FieldComparer());
var duplicateArtifacts = GetDuplicates(artifacts, new ArtifactComparer());
Console.WriteLine("Dup Fields: {0}", string.Join(", ", duplicateFields.Select(x => x.ArtifactID)));
Console.WriteLine("Dup Artifacts: {0}", string.Join(", ", duplicateArtifacts.Select(x => x.ArtifactID)));
private static List<T> GetDuplicates<T>(IEnumerable<T> collection, IEqualityComparer<T> comparer)
List<T> collectionList = collection.ToList();
IEnumerable<T> uniqueItems = collectionList.Distinct(comparer);
if (uniqueItems.Count() == collectionList.Count)
List<T> duplicateItems = collectionList.GroupBy(i => i, comparer).Where(group => group.Count() > 1).Select(group => group.Key).ToList();
public class FieldComparer : IEqualityComparer<Field>
public bool Equals(Field a, Field b)
return a.ArtifactID == b.ArtifactID;
public int GetHashCode(Field field)
return field.ArtifactID.GetHashCode();
public class ArtifactComparer : IEqualityComparer<Artifact>
public bool Equals(Artifact a, Artifact b)
return a.ArtifactID == b.ArtifactID;
public int GetHashCode(Artifact artifact)
return artifact.ArtifactID.GetHashCode();