我有20个项目的列表和一个包含5个项目的数组,我需要比较每个项目的常见属性,如果它匹配..我需要将它们过滤到o / p列表。如何有效地比较它们,而不进行20 * 5 = 100次比较。可能是通过使用hashmap?请帮忙......谢谢
答案 0 :(得分:2)
使用LINQ-to-objects扩展方法Enumerable.Join可能是最简洁的表达方式:
List<MyListType> matches = myList
.Join(myArray,
myListItem => myListItem.someProperty, //if this prop
myArrayItem => myArrayItem.someProperty, //and this prop match
(myListItem, myArrayItem) => myListItem) //project to...
.ToList();
在内部,它使用从连接的左侧创建的类似哈希表的结构(上面的myList
),然后迭代连接的右侧(myArray
上方)寻找从左侧创建的集合中的匹配项。
与上面描述的(天真)笛卡尔积相比,这显着加快了处理速度(&#34; 20 * 5 = 100比较&#34; )
实际上,它确实是这样的:
var lookup = lhs.ToLookup(leftItem => leftItem.someProp);
var matches = rhs.SelectMany(rightItem =>
lookup[rightItem.someProp]
.Select(leftItem => MethodToBeCalledWithTwoMatchingItems(leftItem, rightItem)));
答案 1 :(得分:0)
更有效地散列较小的列表,或者改变较少的列表:
var hashSet = new HashSet<int> { 1, 2, 3, 4, 5 };
var result = list1.Where(item => hashSet.Contains(item.Property));