Для каждого имени свойства, которое вы хотите, вы можете использовать такую функцию, чтобы проверить, имеет ли данное свойство уникальные значения в списке:
bool IsUnique<T>(IEnumerable<T> list, string propertyName)
{
return list.Select(x => x.GetType().GetProperty(propertyName).GetValue(x))
.GroupBy(x => x).All(x => x.Count() == 1);
}
Пример
var properties = new List<string> { "Id", "Name" };
var isUnique = properties.All(p => IsUnique(list, p));
Если по какой-либо причине вы ищете способ проверить, является ли группа этих полей уникальной, например, составной ключ:
bool IsUnique<T>(IEnumerable<T> list, List<string> properties)
{
var subData = list.Select(x => properties.Select(p =>
x.GetType().GetProperty(p).GetValue(x)).ToList());
var q = from d1 in subData
from d2 in subData
where d1.SequenceEqual(d2)
select d1;
return q.Count() == subData.Count();
}
Пример
Например, для следующего списка комбинация «Id» и «Name» не является уникальной, поскольку 1-й и 3-й элементы в списке имеют одинаковую комбинацию «Id» и «Name»:
var list = new[] {
new { Id= 1, Name="P1", Price = 100},
new { Id= 2, Name="P2", Price = 200},
new { Id= 1, Name="P1", Price = 300},
};
var properties = new List<string> { "Id", "Name" };
var isUnique = IsUnique(list, properties); // ← returns false