0

我收到一个排序的整数列表,我想用它来对ListCollectionViewvia进行排序ListCollectionView.CustomSort。此属性接受一个IComparer并且我已经创建了一个,但正如预期的那样,我只能比较通用对象xy.

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;
  }
}
4

3 回答 3

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);
于 2013-03-25T21:51:58.433 回答
1

也许你想回来SortedIds.IndexOf(x.Id).CompareTo(SortedIds.IndexOf(y.Id))

于 2013-03-25T21:50:05.207 回答
0

您可以使用OrderBy按您想要的任何字段进行排序。像这样:

List<Item> sortedById = items.OrderBy(x=>x.Id).ToList();

List<Item> sortedByEgo = items.OrderBy(x=>x.Ego).ToList();

(对于不直接比较的类型,您还可以使用带有 IComparer 参数的 OrderBy 变体,但如果 Id 和 Ego 是整数,则此处不需要)。

于 2013-03-25T23:02:02.077 回答