Linq to Objects中的自定义Icomparer

时间:2012-12-20 09:31:17

标签: c# linq

我有一个清单。

其中T是类,具有int和其他参数等属性

E.g。

  ID Name

  1  Apple
  2  Banana
  3  Test

现在我有另一个指定顺序的列表

Like 2,1,3

所以我想用2,1,3像Banana,Apple和Test

来对它们进行排序

我如何实现这个IComaparer

目前我试了这个但是失败了

 test = test.OrderBy(p=>  SortableIntList.Contains(p.ID));

2 个答案:

答案 0 :(得分:3)

要快速开始工作,

test = test
    .Where(p => SortableIntList.Contains(p.ID))
    .OrderBy(p => SortableIntList.IndexOf(p.ID));

为了提高效率,您可能希望将排序顺序存储在字典中(ID =>位置),然后将其称为

var SortableIntDictionary = SortableIntList
    .Select((ID, Index) => new { ID, Index })
    .ToDictionary(p => p.ID, p => p.Index);
test = test
    .Where(p => SortableIntDictionary.ContainsKey(p.ID))
    .OrderBy(p => SortableIntDictionary[p.ID]);

答案 1 :(得分:2)

试试这个,不需要比较器

 // Setup test data
 var orderList = new List<int> { 2, 1, 3 };

 var stuffList = new List<Stuff> { 
            new Stuff { Id = 1, Name = "Apple" },
            new Stuff { Id = 2, Name = "Banana" },
            new Stuff { Id = 3, Name = "Test" }
        };

 // Do sort according to list
 var result = orderList.Select(idx => stuffList.Where(s => s.Id == idx));

编辑:创建ID查找可能会更快:

var stuffDictionary = stuffList.ToDictionary(s => s.ID, s => s);
var result = orderList.Where(idx => stuffDictionary.ContainsKey(idx))
                      .Select(idx => stuffDictionary[idx]);