C# 基于特性从集合中快速选择元素
如何存储大型集合的多个值,以便能够使用基于具有非唯一值的属性的lambda表达式快速查找它们 示例案例(未针对性能进行优化):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
类产品
{
公共字符串标题{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的示例:
简而言之,您需要:
最简单的解决方案是使用
产品
集合字典。最简单的方法是使用
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