我有一个班级:
public class Item
{
public int ownerID;
public decimal value;
}
一个对象数组
Item[] items;
看起来像:
ownerID value
476478 0.65
636566 0.2
我有第二堂课
public class Owner
{
public int ownerID;
public int index;
}
一个对象数组
Owner[] owners;
“所有者”根据索引按特定顺序排序,如下所示:
ownerID index
636566 1
476478 2
如何使用LINQ和comparer以与“所有者”相同的顺序对“项目”进行排序?
期待类似的事情:
items = items.OrderBy(o => o.OwnerID, comparer(o))
由“index”进行比较。
非常感谢。
答案 0 :(得分:2)
假设您尝试做的是使用Owner对象中的index属性来订购项目,这样的事情就可以完成这项任务:
var joined = items.Join(owners, item => i.OwnerId, owner => o.OwnerId, (item, owner) => new
{
Item = item,
Index = owner.Index
});
var orderedItems = joined.OrderBy(j => j.Index).Select(j => j.Item);
答案 1 :(得分:0)
试试这个
//Initiate new object
Item items= new Items();
//Sort the items based on owner ID
List myList = items.OrderBy(x => x.ownerID).ToList();
答案 2 :(得分:0)
您可以将Owner
数组转换为Dictionary<int, int>
,如下所示:
Dictionary<int, int> ownerDict = owners.ToDictionary(x => x.ownerID, y => y.index);
然后用它来订购像:
这样的项目Item[] orderedItems = items.OrderBy(i => ownerDict[i.ownerID]).ToArray();
要按相同的索引订购商品,请订购所有者。
答案 3 :(得分:0)
您可以使用LINQ .Select()
,它将使用集合迭代器以按自然顺序处理集合。然后,Select中的lambda可用于从items
获取每个对应的项目。像这样:
var itemsInOrder = owners
.Select(x => items.First(item => item.ownerId == x.ownerId))
.ToArray();
这假设可以在items
中找到每个ownerId。如果那不是真的那么你将不得不延长一点,例如像这样:
var itemsInOrder = owners
.Select(x => items.FirstOrDefault(item => item.ownerId == x.ownerId))
.Where(item => item != null)
.ToArray();