Если производительность действительно важна, я думаю, вам нужно Пересечь , поскольку она использует HashSets.
private static int CompareProps(MyObject a, MyObject b)
{
var aValues = a.GetType().GetProperties().Select(x => x.GetValue(a, null));
var bValues = b.GetType().GetProperties().Select(x => x.GetValue(b, null));
return aValues.Intersect(bValues).Count();
}
А вот пример использования ..
var a = new MyObject
{
prop1 = "abc", // same value
prop2 = "def",
prop3 = 123,
prop4 = 456 // same value
};
var b = new MyObject
{
prop1 = "abc", // same value
prop2 = "jkl",
prop3 = 789,
prop4 = 456 // same value
};
Console.WriteLine(CompareProps(a, b)); // output 2
EDIT:
Протестировал мое решение, запустив цикл списка 300X300.
private static void Run()
{
var alist = new List<MyObject>();
for (var i = 0; i < 300; i++)
{
alist.Add(new MyObject
{
prop1 = "abc",
prop2 = RandomString(),
prop3 = random.Next(),
prop4 = 123
});
}
var blist = new List<MyObject>();
for (var i = 0; i < 300; i++)
{
blist.Add(new MyObject
{
prop1 = "abc",
prop2 = RandomString(),
prop3 = random.Next(),
prop4 = 123
});
}
var watch = new Stopwatch();
watch.Start();
Parallel.For(0, alist.Count, i =>
{
for (var j = 0; j < blist.Count; j++)
{
Console.WriteLine("Result: " + CompareProps(alist[i], blist[j]));
}
});
Console.WriteLine(watch.Elapsed.TotalSeconds + " seconds..");
}
Результат: 9,1703053 секунд ..
