LINQ自定义排序使用比较器

时间:2017-09-11 13:04:45

标签: c# .net linq icomparer

我有一个班级:

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”进行比较。

非常感谢。

4 个答案:

答案 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();