我收到一个排序的整数列表,我希望用它来ListCollectionView
通过ListCollectionView.CustomSort
对其进行排序。此属性接受IComparer
并且我创建了一个,但正如预期的那样,我只能比较通用对象x
和y
上的值。
public List<int> SortedIds = new List<int> { 13, 7, 5, 3, 1 };
public class Item {
int Id { get; set; }
}
public class IdComparer : IComparer<Item> {
public int Compare(Item x, Item y) {
// Comparisons
// ???
// return 0;
}
}
答案 0 :(得分:1)
也许您想要返回SortedIds.IndexOf(x.Id).CompareTo(SortedIds.IndexOf(y.Id))
?
答案 1 :(得分:1)
如果您想根据SortedIds
列表中的索引进行比较,可以执行以下操作:
public class IdComparer : IComparer<Item> {
private readonly Dictionary<int, int> idIndexes;
public IdComparer(IEnumerable<int> sortedIds)
{
idIndexes = sortedIds
.Select((id, idx) => new { Id = id, Index = idx })
.ToDictionary(p => p.Id, p.Index);
}
public int Compare(Item x, Item y) {
xIndex = idIndexes[x.Id];
yIndex = idIndexes[y.Id]
return xIndex.CompareTo(yIndex);
}
}
但是你可以使用linq:
IEnumerable<Item> sorted = SortedIds
.Select((id, idx) => new { Id = id, Index = idx })
.Join(items, p => i.Id, item => item.Id, (p, item) => new { Item = item, Index = idx })
.OrderBy(p => p.Index)
.Select(p => p.Item);
答案 2 :(得分:0)
您可以使用OrderBy按照您想要的任何字段进行排序。像这样:
List<Item> sortedById = items.OrderBy(x=>x.Id).ToList();
和
List<Item> sortedByEgo = items.OrderBy(x=>x.Ego).ToList();
(对于不直接比较的类型,您也可以使用带有IComparer参数的OrderBy变体,但如果Id和Ego是整数,则不需要这样。)