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.IndexOf(x.Id).CompareTo(SortedIds.IndexOf(y.Id))ですか?

于 2013-03-25T21:50:05.207 に答える
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 に答える
0

OrderByを使用して、任意のフィールドで注文できます。このような:

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

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

(直接比較しない型の場合、IComparer引数を取るOrderByのバリアントを使用することもできますが、IdとEgoがintの場合、ここでは必要ありません)。

于 2013-03-25T23:02:02.077 に答える