如何将数组中的每个元素与List中的每个元素进行比较?

时间:2017-05-29 20:43:38

标签: c# arrays performance list hashmap

我有20个项目的列表和一个包含5个项目的数组,我需要比较每个项目的常见属性,如果它匹配..我需要将它们过滤到o / p列表。如何有效地比较它们,而不进行20 * 5 = 100次比较。可能是通过使用hashmap?请帮忙......谢谢

2 个答案:

答案 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));