【问题标题】:Matching the order of one array to another将一个数组的顺序与另一个数组匹配
【发布时间】:2013-05-31 09:06:35
【问题描述】:

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

【问题讨论】:

  • 您能给我们展示一些输入/输出示例吗?
  • 我在添加虚拟数据的问题中包含了示例输入。 int 数组是 id 的集合,而 searchResults 是我的对象的集合。输出将是经过排序的对象集合,以便 ID 与 int 数组中 ID 的顺序相匹配。
  • 哦,对了,如果你有一个数组 {-3, 4, -6} 和你的对象有这些 ID,你想根据它对它们进行排序吗?

标签: c# arrays linq sorting


【解决方案1】:

蛮力实现:

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])

【讨论】:

  • 使用查找是一个绝妙的建议。谢谢你。在我看来,它工作得更快,也更干净。我唯一需要做的不同是在 select many 的末尾添加 .ToArray() 以转换为 memberobject 数组
  • @MichaelTaylor3D :我在这里几乎复制了一个 Linq Join。我不确定 Join 对最终排序顺序提供了什么保证,但使用当前的 Join 实现 IdArray.Join(searchResults, x=&gt;x, x=&gt;x.id, (a,b)=&gt;b) 通过几乎相同的方法给出相同的结果。
  • 我使用连接来获得我的初始结果,虽然我得到了我想要的结果,但它们的顺序不正确。
  • Join(外层集合)左边的items的执行顺序。
  • 是的,这就是为什么,我的左边是对象数组,如果我把东西翻过来,我应该能够减少代码中的一些冗余。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 2011-07-06
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多