2013-06-04 42 views
2

我有一个ID数组的正确排序。然后我有一个具有ID属性的无序对象数组。使用linq匹配一个数组的顺序到另一个

我想通过匹配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(); 
    } 
+0

你能告诉我们一些例如输入/输出吗? –

+0

我在添加虚拟数据的问题中包含了示例输入。 int数组是ID的集合,searchResults是我的对象的集合。输出将是排序对象的集合,以便有ID符合int数组中ID的顺序。 – MichaelTaylor3D

+0

哦,对,所以如果你有一个数组{-3,4,6}和有这些ID的对象,你想根据它们对它们进行排序? –

回答

3

蛮力实现:

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

然而,这需要重申SearchResult所为IdArray每一个项目,不与物品处理过那整齐有重复的ID。

如果您为搜索结果创建ILookup,则事情会改进,以便为IdArray中的每个项目获取正确的搜索结果现在是O(1)时间。

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

现在:

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

使用查找是一个奇妙的建议。谢谢你。它的工作速度更快,在我看来更清洁。我需要做的不同的唯一事情就是在选择多个元素的末尾添加.ToArray()以作为成员对象数组投射。 – MichaelTaylor3D

+0

@ MichaelTaylor3D:我几乎在这里复制了一个Linq Join。我不确定什么保证Join提供了最终的排序顺序,但使用当前的Join实现'IdArray.Join(searchResults,x => x,x => x.id,(a,b)=> b)'通过几乎相同的方法给出相同的结果 – spender

+0

我用一个连接来获得我的初始结果,而当我得到我想要的结果时,它们的顺序并不正确。 – MichaelTaylor3D

相关问题