C# 基于特性从集合中快速选择元素

C# 基于特性从集合中快速选择元素,c#,linq,optimization,query-optimization,C#,Linq,Optimization,Query Optimization,如何存储大型集合的多个值,以便能够使用基于具有非唯一值的属性的lambda表达式快速查找它们 示例案例(未针对性能进行优化): 类产品 { 公共字符串标题{get;set;} 公共整数价格{get;set;} 公共字符串说明{get;set;} } IList products=this.LoadProducts(); var q1=产品。其中(c=>c.Title==“你好”);//1产品。 var q2=产品。其中(c=>c.Title==“样本”);//5种产品。 var q3=produ

如何存储大型集合的多个值,以便能够使用基于具有非唯一值的属性的lambda表达式快速查找它们

示例案例(未针对性能进行优化):

类产品
{
公共字符串标题{get;set;}
公共整数价格{get;set;}
公共字符串说明{get;set;}
}
IList products=this.LoadProducts();
var q1=产品。其中(c=>c.Title==“你好”);//1产品。
var q2=产品。其中(c=>c.Title==“样本”);//5种产品。
var q3=products.Where(c=>string.IsNullOrEmpty(c.Title));//12345种产品。

若标题是唯一的,那个么通过使用
IDictionary
HashSet
可以很容易地优化性能。但是,如果值不是唯一的,该怎么办呢?

您需要的是能够在LINQ中运行索引查询。(与我们在SQL中所做的相同)

有一个名为i4o的库显然可以解决您的问题:

从他们的网站:

i4o(对象索引)是第一个扩展LINQ的类库 允许您在对象上放置索引。使用i4o时 LINQ操作通常比不使用LINQ时快一千倍以上 i4o

i4o的工作原理是允许开发人员指定 为任何类指定索引,然后使用 IndexableCollection来实现该类的集合 在以下情况下,将使用索引规范,而不是顺序搜索 执行可以从索引中获益的LINQ操作

下面还提供了如何使用i4o的示例:

简而言之,您需要:

  • 将[Indexable()]属性添加到“Title”属性
  • 使用IndexableCollection作为数据源
  • 从这一点来看,任何使用可索引字段的linq查询都将使用索引,而不是进行顺序搜索,从而导致使用索引的查询的magnituide性能提高的顺序

  • 最简单的解决方案是使用
    产品
    集合字典。最简单的方法是使用

    var products = this.LoadProducts().ToLookup(p => p.Title);
    
    var example1 = products["Hello"]; // 1 product
    var example2 = products["Sample"]; // 5 products
    

    您的第三个示例有点难,但您可以使用它。

    Title
    上排序的二叉搜索树可能(如果这是您需要查找的唯一属性)无法编译您的上一个查询。你的意思是
    string.IsNullOrEmpty(c.Title)
    ?我还没有在生产中使用它,但我很期待这样做。
    var products = this.LoadProducts().ToLookup(p => p.Title);
    
    var example1 = products["Hello"]; // 1 product
    var example2 = products["Sample"]; // 5 products