我需要将大量复杂(20多个属性)对象过滤到多个子列表中。要创建子列表,我有一个过滤器规范列表。要求是:a)不允许某个项目成为两个子列表的一部分; b)处理完成后必须能够获取所有未分割的项目。
目前我使用以下算法:
我最初的对象列表可能超过400.000个对象,我注意到过滤以及减少工作列表都需要一些时间。所以我想知道:
提前致谢!
答案 0 :(得分:4)
如果您无法利用传入列表中的任何索引,那么您最好只需遍历整个列表一次,然后对项目进行分类。这样就可以避免不必要的删除和除了操作,这些操作会严重损害无意义迭代和相等比较的性能。
我正在考虑以下几点:
public static IDictionary<string, List<T>> Classify<T>(this IEnumerable<T> items, IDictionary<string, Predicate<T>> predicates, out List<T> defaultBucket)
{
var classifiedItems = new Dictionary<string, List<T>>(predicates.Count);
defaultBucket = new List<T>();
foreach (var predicate in predicates)
{
classifiedItems.Add(predicate.Key, new List<T>());
}
foreach (var item in items)
{
var matched = false;
foreach (var predicate in predicates)
{
if (predicate.Value(item))
{
matched = true;
classifiedItems[predicate.Key].Add(item);
break;
}
}
if (!matched)
{
defaultBucket.Add(item);
}
}
return classifiedItems;
}
任何给定的predicate
都可以像你需要的那样复杂。唯一的条件是它需要T
并返回bool
。如果这还不够,那么没有什么能阻止您使用您需要的任何签名来实现自己的MyPredicate<???>
。
编辑:编辑代码以处理&#34; 默认存储桶&#34;哪些项目不符合任何指定的谓词。