0

我有一个清单。

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

例如

  ID Name

  1  Apple
  2  Banana
  3  Test

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

Like 2,1,3

所以我想使用 2,1,3 像 Banana,Apple 对它们进行排序,然后测试

我怎样才能用 IComaparer 实现这个

目前我尝试这个但它失败了

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

2 回答 2

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]);
于 2012-12-20T09:39:54.477 回答
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]);
于 2012-12-20T09:44:37.280 回答