匹配一个数组与另一个数组的顺序

时间:2013-06-04 20:25:11

标签: c# arrays linq sorting

我有一个正确排序的ID的int数组。然后我有一个具有ID属性的无序对象数组。

我想按ID排序符合int数组顺序的对象。

的内容
newObjectArray = oldObjectArray.MatchOrderBy(IdArray)

最可取的

我觉得我应该能够使用LINQ完成此任务,但我还没有找到办法。

我当前的方法看起来效率不高,因为它必须查询集合的每次迭代。我怀疑性能会因足够大的集合而受到影响。最终会发生这种情况。

这是我目前的实施:

    //this is just dummy data to show you whats going on
    int[] orderedIDs = new int[5] {5534, 5632, 2334, 6622, 2344};
    MemberObject[] searchResults = MyMethodToGetSearchResults();

    MemberObject[] orderedSearchResults = new MemberObject[orderedIDs.Count()];
    for(int i = 0; i < orderedIDs.Count(); i++)
    {
        orderedSearchResults[i] = searchResults
                                                .Select(memberObject => memberObject)
                                                .Where(memberObject => memberObject.id == orderedIDs[i])
                                                .FirstOrDefault();
    }

1 个答案:

答案 0 :(得分:4)

蛮力实施:

MemberObject[] sortedResults = 
      IdArray.Select(id => searchResults
                           .FirstOrDefault( item => item.id == id ))

但是,这需要重复IdArray中每个项目的searchResults,并且不会过于巧妙地处理具有重复ID的项目。

如果您对搜索结果进行ILookup,情况会有所改善,因此在IdArray中抓取每个项目的正确搜索结果现在是O(1)时间。

ILookup<int, MemberObject> resultLookup = searchResults.ToLookup(x => x.id);

现在:

MemberObject[] sortedResults = 
      IdArray.SelectMany(id => resultLookup[id])