Как проверить несколько атрибутов, имеющих уникальную комбинацию в Списке, где имена атрибутов доступны как отдельная коллекция.[C #] - PullRequest
0 голосов
/ 23 мая 2018

У меня есть сценарий, где у меня есть список выбранных атрибутов в строковом формате.Основываясь на этом списке, я хочу выполнить операцию с фактической коллекцией объектов, чтобы проверить, являются ли заданные свойства, имеющие уникальную комбинацию значений в этом списке,

Пример. Здесь Имя и Тип являются выбранными атрибутами (указанными в списке selectedProductAttributes), которые мыхочу проверить уникальность для этих атрибутов с коллекцией продуктов.Мы могли бы использовать отражение, чтобы получить реальные свойства, но я не уверен, как этого добиться.Любая помощь приветствуется.

public class Product
{
    public string Name { get; set; }
    public string Type { get; set; }
    public string Price { get; set; }
}

private List<string> selectedProductAttributes = new List<string> {"Name", "Type"};

private List<Product> products = new List<Product>
    {
        new Product {Name= "a", Type="t1", Price=10},
        new Product {Name= "a", Type="t1", Price=20},
        new Product {Name= "b", Type="t2", Price=30}
    };

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Попробуйте следующий фрагмент и дайте мне знать, если это то, что вы ищете

var query = from product in products
        from property in typeof(Product).GetProperties()
        join toCompare in selectedProductAttributes on property.Name equals toCompare
        let temp = new {
            Name = property.Name,
            Value = property.GetValue(product)
        }
        group temp by temp.Name into gg
        select new
        {
            Name = gg.Key,
            IsDuplicated = gg.Count() > 1
        };
0 голосов
/ 23 мая 2018

Для каждого имени свойства, которое вы хотите, вы можете использовать такую ​​функцию, чтобы проверить, имеет ли данное свойство уникальные значения в списке:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...