C# 按另一个集合中的值对一个集合中的项进行排序

C# 按另一个集合中的值对一个集合中的项进行排序,c#,linq,C#,Linq,我在内存中有2个IEnumerable对象集合 Collection1是一个包含以下内容的列表: Id, Name, Category etc. Collection2是一个包含 Id, SortOrder 每个集合中的Id将具有相应的值 SortOrder是一个int 我需要根据Collection2中SortOrder的值对Collection1进行排序 有人知道怎么做吗?你可能只想加入他们,然后按正确的字段订购 from obj1 in collection1 join o

我在内存中有2个IEnumerable对象集合

Collection1是一个包含以下内容的列表:

Id, Name, Category etc.
Collection2是一个包含

Id, SortOrder
每个集合中的Id将具有相应的值

SortOrder是一个int

我需要根据Collection2中SortOrder的值对Collection1进行排序


有人知道怎么做吗?

你可能只想加入他们,然后按正确的字段订购

   from obj1 in collection1
   join obj2 in collection2 on obj1.Id equals obj2.Id
   orderby obj2.SortOrder
   select obj1 
或者,如果你和我一样喜欢Lamda语法

var result = collection1.Join(collection2, 
                              a => a.Id, 
                              b => b.Id,
                             (a, b) => new {Obj1 = a,Obj2 = b})
                        .OrderBy(x => x.Obj2.SortOrder)
                        .Select(x => x.Obj1);
在不加入的情况下执行此操作的方法是将Id/Sortorder集合放入字典并查找Sortorder:

var sortOrderDict = collection2.ToDictionary(k => k.Id, v => v.SortOrder);
var result = coll1.OrderBy(x => sortOrderDict[x.Id]);
你甚至可以用这种优雅的方式洗牌:

var sorted = coll1.OrderBy(_ => Guid.NewGuid());

它适用于我..

加入它们,并按排序规则排序-与sql查询中的排序规则相同。排序规则中的值是多少?是实际的排序顺序(如ASC/DESC)、要排序的列的名称还是希望它们显示的实际顺序?根据存储在该列中的数据,有几种方法可以实现此目的。无需join@alerya这不是绝对必要的,但如果你不打算加入,那么至少要高效地去做@SteveP-排序顺序的值是一个intThis
var sorted=coll1.OrderBy(x=>coll2.FirstOrDefault(y=>x.Id==y.Id).order)效率极低。小名单,很好。更大的名单太可怕了!结构中的NRE LOL,-祝贺你!显示洗牌不是错误的答案。好吧,我错过了它将是一个结构。但仍然效率低下。关于效率的问题在哪里?对于短名单,你们的答案效率不高。但问题不在于效率。我认为值得注意的是,
可枚举.Join
本质上与
ToDictionary
内部使用
查找功能相同,并且尽可能高效。事实上,我可以将Id、SortOrder项设置为字典-它们不是来自数据库。看来你建议的第二个选择将是最有效的。谢谢你的帮助。
(5, E, EE)
(4, D, DD)
(3, C, CC)
(2, B, BB)
(1, A, AA)
Press any key to continue . . .
var sorted = coll1.OrderBy(_ => Guid.NewGuid());
// here sortedlist1 will be sorted    
var sortedlist1 = list1.OrderBy(x=>x.id = GetOrder(x.id));

public int Getorder(int id)
{
    return list2.Where(x=> x.id ==id).FirstOrDefault().SortedOrder;
}