我的问题是关于IComparer
界面,我以前从未使用过它,所以我希望你能帮我设置好一切。
我必须使用该接口按照另一个List<int>
的确切顺序对自己的对象列表进行排序。
我在网上找不到任何有用的问题,我找到的所有内容都是linq语句,我不能使用。
以下是示例代码:
public class What : IComparer<What>
{
public int ID { get; set; }
public string Ever { get; set; }
public What(int x_ID, string x_Ever)
{
ID = x_ID;
Ever = x_Ever;
}
public int Compare(What x, What y)
{
return x.ID.CompareTo(y.ID);
}
}
可以使用的一些数据:
List<What> WhatList = new List<What>()
{
new What(4, "there"),
new What(7, "are"),
new What(2, "doing"),
new What(12, "you"),
new What(78, "Hey"),
new What(63, "?")
};
以及正确顺序的列表:
List<int> OrderByList = new List<int>() { 78, 4, 63, 7, 12, 2 };
现在我如何告诉IComparer
按OrderByList
排序?
我真的不知道如何做到这一点,我知道linq会很容易,但我没有机会使用它。
答案 0 :(得分:4)
您的代码目前存在一些问题。如果您查看docs for IComparer<T>
,您会看到T
就是您要比较的内容。在您的代码中,这是Test
,但您继续编写代码以进行What
的比较 - 这意味着您的代码将无法编译。请参阅here - 错误消息为:
'Rextester.What'没有实现接口成员'System.Collections.Generic.IComparer.Compare(Rextester.Test,Rextester.Test)'
(忽略那里的“Rextester”位!)。
完成所有这些后,您应该实现WhatComparer
:
public class WhatComparer : IComparer<What>
{
private List<int> orderBy;
public WhatComparer(List<int> orderBy)
{
this.orderBy = orderBy;
}
public int Compare(What x, What y)
{
return orderBy.IndexOf(x.ID).CompareTo(orderBy.IndexOf(y.ID));
}
}
并将其用于订购:
WhatList.Sort(new WhatComparer(OrderByList));
答案 1 :(得分:3)
您应该创建另一个类来进行比较,并为其提供所需的顺序:
public class OrderComparer : IComparer<What>
{
private readonly Dictionary<int, int> idIndexes = new Dictionary<int, int>();
public OrderComparer(List<int> idOrders)
{
for(int i = 0; i < idOrders.Length; i++)
{
idIndexes[idOrders[i].ID] = i;
}
}
public int Compare(What x, What y)
{
return idOrders[x.ID].Compare(idOrders[y.ID]);
}
}
然后你可以这样做:
WhatList.Sort(new OrderComparer(OrderByList));
答案 2 :(得分:2)
最简单的方法是使用自定义Comparison<T>
:
WhatList.Sort((x, y) =>
{
return OrderByList.IndexOf(x.ID).CompareTo(orderByList.IndexOf(y.ID));
});