Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用比较器的LINQ自定义排序_C#_.net_Linq_Icomparer - Fatal编程技术网

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找到了这样做的方法。