使用比较器的 LINQ 自定义排序

LINQ custom sort using comparer

我有一个 class:

public class Item
{
  public int ownerID;
  public decimal value;
}

还有一个对象数组

Item[] items;

看起来像:

ownerID     value
476478      0.65
636566      0.2

我还有第二个class

public class Owner
{
  public int ownerID;
  public int index;
}

还有一组对象

Owner[] owners;

"owners" 根据索引按特定顺序排序,如下所示:

ownerID    index
636566     1
476478     2

如何使用 LINQ 和比较器按与 "owners" 相同的顺序对 "items" 进行排序?

预计会是这样的:

items = items.OrderBy(o => o.OwnerID, comparer(o))

"index" 进行的比较。

非常感谢。

试试这个

//Initiate new object 
    Item items= new Items(); 
//Sort the items based on owner ID 
List myList = items.OrderBy(x => x.ownerID).ToList();  

您可以像这样将 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();

要按相同索引对项目进行排序,对所有者进行排序。

您可以使用 LINQ .Select(),它将使用集合迭代器按自然顺序处理集合。然后可以使用 Select 中的 lambda 从 items 中获取每个对应的项目。像这样:

var itemsInOrder = owners
    .Select(x => items.First(item => item.ownerId == x.ownerId))
    .ToArray();

这假定每个 ownerId 都可以在 items 中找到。如果那不是真的,那么你将不得不稍微扩展它,例如像这样:

var itemsInOrder = owners
    .Select(x => items.FirstOrDefault(item => item.ownerId == x.ownerId))
    .Where(item => item != null)
    .ToArray();

假设您要做的是使用 Owner 对象的索引 属性 来订购商品,这样的事情应该可以完成:

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