将一个数组的顺序匹配到另一个数组

本文关键字:数组 顺序 另一个 一个 | 更新日期: 2023-09-27 18:16:50

我有一个正确排序的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();
    }

将一个数组的顺序匹配到另一个数组

蛮力实现:

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

但是,这需要为IdArray中的每个项重复searchResults,并且不能很好地处理具有重复id的项。

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

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

:

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