using System.Collections.Generic;
public class A : IEquatable<A> {
public string Ab {get; set;}
public string B{get; set;}
public bool IsD {get; set;}
public bool Equals(A other)
if (Object.ReferenceEquals(other, null)) return false;
if (Object.ReferenceEquals(this, other)) return true;
return Ab == other.Ab && B == other.B && IsD == other.IsD;
public override int GetHashCode()
return $"{Ab}-{B}-{IsD}".GetHashCode();
public string ToString() => $"{Ab}-{B}-{IsD}";
public static void Main()
var a = new A { Ab = "a", B = "b", IsD = false };
var b = new A { Ab = "a", B = "b", IsD = false };
var c = new A { Ab = "abcd", B = "b", IsD = false };
var list = new List<A>();
foreach(var o in list) Console.WriteLine(o.ToString());
var query = list.GroupBy(x => x)
.Where(g => g.Count() > 1)
foreach(var o in query) {
foreach(var i in list.FindAll(x=>x.Ab == o.Ab && x.B == o.B)) {
foreach(var o in list) Console.WriteLine(o.ToString());