通过T2 []在T1 []中找到T1的有效方法,其中T2 []是T1的属性?

时间:2017-09-06 13:47:01

标签: c#

通过给定示例中的属性快速查找产品的方法是什么?我有一个包含3000个产品的列表,每个产品都有一个包含12个属性对象的列表,如示例中所示。我需要能够使用n个属性快速找到产品。

public class Test
{
    public class ProductProperty
    {
        public string Name { get; set; }
        public string Value { get; set; }
        public ProductProperty() { }
        public ProductProperty(string name, string value)
        {
            this.Name = name;
            this.Value = value;
        }
    }
    public class Product
    {
        public string ProductName { get; set; }
        public ProductProperty[] Properties { get; set; }
    }

    public static void Main(string[] args)
    {
        List<Product> models = new List<Product>()
        {
            new Product() { ProductName = "Test1", Properties = new ProductProperty[] { new ProductProperty("title", "car"), new ProductProperty("length", "5") } },
            new Product() { ProductName = "Test1", Properties = new ProductProperty[] { new ProductProperty("title", "car"), new ProductProperty("length", "7") } },
            new Product() { ProductName = "Test1", Properties = new ProductProperty[] { new ProductProperty("title", "ship"), new ProductProperty("length", "9") } },
        };

        var findByProps = new ProductProperty[] { new ProductProperty("title", "car"), new ProductProperty("length", "7") };

        // var product = find Product that has title=car and length=7

    }
}

1 个答案:

答案 0 :(得分:4)

如果覆盖ProductProperty内的等于方法:

public override bool Equals(object o) => o is ProductProperty p && p.Name == Name && p.Value== Value;

将ProductProperty相互比较更容易(您也可以实现IEquatable)。 (注意,旧的Visual工作室不支持上面的语法,但如果需要可以轻松地重写) 一旦被覆盖,可以使用任何默认方法,例如Contains:

var product = models.FirstOrDefault(m=> findByProps.All(m.Properties.Contains));