我有一个ID的整数数组,这些数组的顺序正确.然后,我有一个具有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();
}
解决方法:
暴力实施:
MemberObject[] sortedResults =
IdArray.Select(id => searchResults
.FirstOrDefault( item => item.id == id ))
但是,这要求为IdArray中的每个项目重复搜索结果,并且不能对具有重复ID的项目进行过于整洁的处理.
如果对搜索结果进行ILookup,事情会有所改善,因此,为IdArray中的每个项目获取正确的搜索结果现在是O(1)时间.
ILookup<int, MemberObject> resultLookup = searchResults.ToLookup(x => x.id);
现在:
MemberObject[] sortedResults =
IdArray.SelectMany(id => resultLookup[id])