如何使用IComparer <t>按任意值排序?</t>

时间:2013-03-25 21:46:37

标签: c# sorting icomparer

我收到一个排序的整数列表,我希望用它来ListCollectionView通过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;
  }
}

3 个答案:

答案 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是整数,则不需要这样。)