C# Linq中的自定义Icomparer到对象

C# Linq中的自定义Icomparer到对象,c#,linq,C#,Linq,我有一张单子 其中T是一个类,具有int等属性和其他参数 例如 现在我有另一个列表,它指定了顺序 Like 2,1,3 所以我想用2,1,3对它们进行分类,比如香蕉,苹果,然后进行测试 我如何实现这个wihh IComaparer 目前我尝试了这个,但失败了 test = test.OrderBy(p=> SortableIntList.Contains(p.ID)); 为了让它快速工作 test = test .Where(p => SortableIntList.

我有一张单子

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

例如

现在我有另一个列表,它指定了顺序

Like 2,1,3
所以我想用2,1,3对它们进行分类,比如香蕉,苹果,然后进行测试

我如何实现这个wihh IComaparer

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

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

为了让它快速工作

test = test
    .Where(p => SortableIntList.Contains(p.ID))
    .OrderBy(p => SortableIntList.IndexOf(p.ID));
为了提高效率,您可能希望将排序顺序存储在字典中(ID=>position),然后像这样调用它

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]);

为了让它快速工作

test = test
    .Where(p => SortableIntList.Contains(p.ID))
    .OrderBy(p => SortableIntList.IndexOf(p.ID));
为了提高效率,您可能希望将排序顺序存储在字典中(ID=>position),然后像这样调用它

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]);

试试这个,不需要比较器

 // 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));

试试这个,不需要比较器

 // 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));

@月亮实际上\@我觉得TommyGroves对此有一个更好的解决方案。您的第二个字典解决方案给了我一个错误,我不确定为什么“字典中没有给定的键”。它不应该这样做,它会在尝试使用它之前检查键是否在那里:-/这是我写的:var SortableIntDictionary=OrderedClient.Select((ID,Index)=>new{ID,Index}).ToDictionary(p=>p.ID,p=>p.Index);clients=clients.OrderBy(p=>SortableIntDictionary[p.Id]).ToList();虽然不需要太多,但它还是因为我提到的错误而崩溃。它第二次失败了line@Moons听起来你的
T
列表中有一个ID,但它没有出现在你的排序列表中,因此我的
Where
行出现在第二个查询中。@Moons实际上\@我觉得TommyGroves对此有一个更好的解决方案。您的第二个字典解决方案给了我一个错误,我不确定为什么“字典中没有给定的键”。它不应该这样做,它会在尝试使用它之前检查键是否在那里:-/这是我写的:var SortableIntDictionary=OrderedClient.Select((ID,Index)=>new{ID,Index}).ToDictionary(p=>p.ID,p=>p.Index);clients=clients.OrderBy(p=>SortableIntDictionary[p.Id]).ToList();虽然不需要太多,但它还是因为我提到的错误而崩溃。它第二次失败了line@Moons听起来你的
T
列表中有一个ID,它没有出现在你的排序列表中,因此我的
Where
行出现在第二个查询中。这实际上比我的想法要好得多,尽管我会从
StuffList
制作一个ID=>Stuff字典,将
Where
转换为O(1)等价物。@TommyGrovnes这看起来怎么样?这实际上比我的主意好得多,不过我会从
StuffList
制作一个ID=>Stuff字典,将
Where
转换成O(1)等价物。@TommyGrovnes这看起来怎么样?