2017-09-06 102 views
0

什麼是按照給定示例中的屬性查找產品的快速方法?我有一個包含3000個產品的列表,每個列表都有12個屬性對象,如示例中所示。我需要能夠使用n個屬性快速查找產品。通過T2 []在T1 []中找到T1的有效方法其中T2 []是T1上的屬性?

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 

    } 
} 

回答

4

如果覆蓋內ProductProperty Equals方法:

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

更容易互相比較ProductProperty(你也可以實現IEquatable)。 (NB,上面語法不是由較老的視覺工作室支承,但是如果需要可以很容易地被重寫) 一旦重寫時,可以使用任何默認方法如包含:

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

如果是隻有一次動作' FirstOrDefault'將起作用。如果您想多次這樣做,我建議您對您的收藏進行排序並使用二分查找。 – rraszewski

+0

這很有趣!注意詳細說明「m => findByProps.All(m.Properties.Contains)」?什麼作爲參數傳遞給Contains? findByProps中的每個元素?是不是寫了「m => findByProps.All(prop => m.Properties.Contains(prop))」? –

+1

是的,它是一樣的,但沒有額外的lambda。 Properties數組實例的'Contains'方法直接傳遞給'All'(擴展)方法,因此可以通過'All'中的每次迭代直接調用它。 –

相關問題