C# 使用比较器的LINQ自定义排序
我有一门课:C# 使用比较器的LINQ自定义排序,c#,.net,linq,icomparer,C#,.net,Linq,Icomparer,我有一门课: public class Item { public int ownerID; public decimal value; } 和一组对象 Item[] items; 这看起来像: ownerID value 476478 0.65 636566 0.2 ownerID index 636566 1 476478 2 我还有第二节课 public class Owner { public int ownerID;
public class Item
{
public int ownerID;
public decimal value;
}
和一组对象
Item[] items;
这看起来像:
ownerID value
476478 0.65
636566 0.2
ownerID index
636566 1
476478 2
我还有第二节课
public class Owner
{
public int ownerID;
public int index;
}
和一组对象
Owner[] owners;
所有者根据索引按特定顺序排序,如下所示:
ownerID value
476478 0.65
636566 0.2
ownerID index
636566 1
476478 2
如何使用LINQ和comparer按照与所有者相同的顺序对项目进行排序
我会期待类似于:
items = items.OrderBy(o => o.OwnerID, comparer(o))
通过索引进行比较
非常感谢 试试这个
//Initiate new object
Item items= new Items();
//Sort the items based on owner ID
List myList = items.OrderBy(x => x.ownerID).ToList();
您可以将所有者数组转换为字典,如下所示:
Dictionary<int, int> ownerDict = owners.ToDictionary(x => x.ownerID, y => y.index);
var itemsInOrder = owners
.Select(x => items.FirstOrDefault(item => item.ownerId == x.ownerId))
.Where(item => item != null)
.ToArray();
若要按相同索引对项目进行排序,将对所有者进行排序 您可以使用LINQ.Select,它将使用集合迭代器以自然顺序处理集合。然后可以使用Select中的lambda从items中获取每个对应的项。像这样:
var itemsInOrder = owners
.Select(x => items.First(item => item.ownerId == x.ownerId))
.ToArray();
这假设每个ownerId都可以在项目中找到。如果这不是真的,那么您必须稍微扩展它,例如:
Dictionary<int, int> ownerDict = owners.ToDictionary(x => x.ownerID, y => y.index);
var itemsInOrder = owners
.Select(x => items.FirstOrDefault(item => item.ownerId == x.ownerId))
.Where(item => item != null)
.ToArray();
假设您正在尝试使用所有者对象的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);
到目前为止你尝试了什么?@Reniuz请查看更新。谢谢。很抱歉,我看不到您发布的代码您尝试过的代码。如果有,items.OrderByi=>I.OwnerID。。。即使是单字母的名字也应该明智地选择。你能改变物品类别来保存对所有者的引用而不仅仅是它的id吗?太棒了!谢谢。但是我还有一个问题-物品的排序不应该根据所有者的索引,而是根据所有者ID在数组中的实际位置。如何更改您的代码?提前谢谢。Ok找到了这样做的方法。