ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

如何在列表中检查具有唯一组合的多个属性,其中属性名称可用作单独的集合. [C#]

2019-11-09 02:09:23  阅读:11  来源: 互联网

标签:reflection linq c



在这种情况下,我有一个字符串格式的选定属性列表.
基于该列表,我想对实际对象集合执行操作,以检查给定属性在该列表中是否具有唯一的值组合.

示例-这里的名称和类型是选定的属性(在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}
    };

解决方法:

对于所需的每个属性名称,可以使用以下函数检查给定属性在列表中是否具有唯一值:

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”和“名称”的组合不是唯一的,因为列表中的第一项和第三项具有“ Id”和“名称”的相同组合:

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


标签:reflection,linq,c

专注分享技术,共同学习,共同进步。侵权联系[admin#icode9.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有