3

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

我想按与 int 数组顺序匹配的 ID 对对象进行排序。

类似的东西

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();
    }
4

1 回答 1

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])
于 2013-06-04T20:34:14.570 回答